1.Drawable简介
Android系统中将可绘制对象被抽象为Drawable,不同的绘制资源对应着不同的Drawable类型。Android FrameWork提供了常用的Drawable,Android控件的绘制资源基本都是通过Drawable形式实现的。一般情况下,开发者是不会直接接触Drawable的具体实现的,Drawable资源一般都放在res/drawable目录下,用户通过图片,xml格式的Drawable资源来使用。
Android内置的比较常用的Drawable类型包括:ColorDrawable、GradientDrawable、ShapeDrawable、BitmapDrawable、 NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、RotateDrawable、AnimationDrawable、LayerDrawable、LevelListDrawable、StateListDrawable、TransitionDrawable。
2.Drawable 特性
Drawable 比 View 更轻量级,它只是 View 绘制中过程被调用的一个东西(背景,前景)。
自定义 View 的时候,如果只要改变背景的话,最好不要去重写 draw 函数,Drawable 这个类已经被抽象出来负责背景的绘制了。
Drawable 有许许多多的子类,但最复杂的还是 Drawable 本身,作为父类的它要考虑到方方面面。
1).setBounds
最基本的形状是什么,是矩形。
无论 Drawable 最终呈现在画布上是什么形状的,它总是被限定在一个矩形当中。void setBackgroundBounds() {
if (mBackgroundSizeChanged && mBackground != null) {
mBackground.setBounds(0, 0, mRight - mLeft, mBottom - mTop);
mBackgroundSizeChanged = false;
rebuildOutline();
}
}
在绘制背景时,会将 View 的坐标转换为 bounds,所以 Drawable 都会被拉伸至 View 的大小。canvas.drawRect(getBounds(), mPaint);
2).setCallBackpublic static interface Callback {
public void invalidateDrawable(Drawable who);
public void scheduleDrawable(Drawable who, Runnable what, long when);
public void unscheduleDrawable(Drawable who, Runnable what);
}
View 在设置背景时,drawable 会把 callback 指向 View。background.setCallback(this);
Drawable 在需要重绘时,会调用:public void invalidateSelf() {
final Callback callback = getCallback();
if (callback != null) {
callback.invalidateDrawable(this);
}
}@Override
public void invalidateDrawable(@NonNull Drawable drawable) {
if (verifyDrawable(drawabl