Drawable

Drawable就是一个可绘制的对象,或者叫做可渲染的对象,里面保存的是可以绘制的数据,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还可能只是一个颜色(ColorDrawable)等等,等等。

java.lang.Object
android.graphics.drawable.Drawable
Known Direct Subclasses AnimatedVectorDrawable, BitmapDrawable, ClipDrawable, ColorDrawable, DrawableContainer, GradientDrawable, InsetDrawable, LayerDrawable, NinePatchDrawable, PictureDrawable, RotateDrawable, RoundedBitmapDrawable, ScaleDrawable, ShapeDrawable, VectorDrawable
Known Indirect Subclasses AnimatedStateListDrawable, AnimationDrawable, LevelListDrawable, PaintDrawable, RippleDrawable, StateListDrawable, TransitionDrawable

1.android 中 Drawable 类对象主要的功能就是可以给 canvas 上面绘制图形,也可以理解为渲染 canvas。这个功能是通过 Drawable 类对象的 public void draw(Canvas canvas)方法来实现的。

2.Drawable 类对象还可以设置给 View 类对象作为 View 类对象的背景等,如果 Drawable 类对象的属性修改了,Drawable 类对象可以通知关联的 View 类对象重新绘制 View 类对象,这功能是通过 Drawable 类对象的 public void invalidateSelf() 方法来实现的。invalidateSelf 方法会调用关联的 Drawable.Callback 类对象(一般是 View 类对象)的 invalidateDrawable 方法。


ConstantState

每个 Drawable 类对象类都关联有一个 ConstantState 类对象,这是为了保存 Drawable 类对象的一些恒定不变的数据,如果从同一个 res 中创建的 Drawable 类对象,为了节约内存,它们会共享同一个 ConstantState 类对象。比如一个 ColorDrawable 类对象,它会关联一个 ColorState 类对象,color 的颜色值是保存在 ColorState 类对象中的。如果修改 ColorDrawable 的颜色值,会修改到 ColorState 的值,会导致和 ColorState 关联的所有的 ColorDrawable 的颜色都改变。在修改 ColorDrawable 的属性的时候,需要先调用public Drawable mutate() 方法,让 Drawable 复制一个新的 ConstantState 对象关联。

例子:http://stackoverflow.com/questions/27115181/button-with-getbackground-setalpha-on-version-5-lollipop-isnt-working-corre 详细解释:http://www.curious-creature.com/2009/05/02/drawable-mutations/

更多相关文章

  1. Binder 理论部分笔记整理
  2. android 判断字符串是否为空与比对["=="与equals()的区别]
  3. Android(安卓)Service组件在进程内绑定(bindService)过程
  4. Android绘图系列(五)——绘制文本
  5. android webview 加载本地html并且解决多图卡顿问题
  6. Java,Android内存泄漏代码片段
  7. Android如何获取视频首帧图片
  8. Android中的Application类
  9. Android(安卓)- Intent

随机推荐

  1. android 播放来电铃声
  2. android中动画的使用
  3. unity在android显示界面(UnityPlayerActiv
  4. LinearLayout和RelativeLayout的属性差异
  5. 存储容量检测 注意构建StatFs对象的参数
  6. Android_判断文件是否存在并创建代码
  7. 编译Android 使用 Java5 还是 Java6
  8. RecyclerView详解(二):ItemDecoration使用(k
  9. java.lang.ClassCastException:org.apach
  10. android studio 编译后 app-debug.apk 和