Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念,他的种类有很多,最常见的颜色和图片都可以是一个Drawable。
(这篇文章粗略的介绍Drawable,下一篇文章详细介绍Drawable的ShapeDrawable )
- Drawable简介
- Drawable分类
- 自定义Drawable
Drawable简介
- Drawable有很多中,他们都表示一种图像的概念,但是他们又不全是图片,通过颜色也可以构造出各种各样的图像的效果,
- 开发中Drawable常被用来作为View的背景使用。
- Drawable一般通过XML来创建,(也可以使用java代码创建,但会稍显复杂)
- 在Android设计中,Drawable是一个抽象的类,是所有Drawable对象的基类。
- 一般来说Drawable没有大小的概念
- Drawable可通过getIntrinsicWidth()和getIntrinsicHeight()获取其内部宽/高。
Drawable分类
详细见文章要点提炼|开发艺术之Drawable,这里只进行粗略的介绍
BitmapDrawable (常用) | 表示一张图片 |
NinePatchDrawable | .9格式的图片 |
ShapeDrawable (常用) | 可表示纯色、有渐变效果的基础几何图形(矩形,圆形,线条等) |
LayerDrawable(常用) | 表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。 |
StateListDrawable (常用) | 表示一个Drawable的集合,每个Drawable对应着View的一种状态。 |
LevelListDrawable | 表示一个Drawable集合,集合中的每个Drawable都有一个等级的概念。 |
TransitionDrawable | LayerDrawable的子类,实现两层 Drawable之间的淡入淡出效果。 |
InsetDrawable | 表示把一个Drawable嵌入到另外一个Drawable的内部,并在四周留一些间距。 |
ScaleDrawable | 表示将Drawable缩放到一定比例。 |
ClipDrawable | 表示裁剪一个Drawable。 |
自定义Drawable
推荐阅读:Drawable绘制过程源码分析和自定义Drawable实现动画
- Drawable的工作原理的核心是draw():系统调用Drawable的draw()来绘制View的背景或ImageView的图像。
- Drawable使用范围单一,一是作为ImageView中的图像来显示,另外(大部分情况)就是作为View背景
- 首先没有必要去自定义Drawable,因为自定义的Drawble无法在xml中使用,这样就降低了Drawable的使用范围
- 必须重写其draw()、setAlpha()、setColorFilter()、getOpacity()等方法。
- 当自定义的Drawable有固有大小时,最好重写getIntrinsicWidth()和getIntrinsicHeight(),因为它会影响到View的wrap_content布局。
自定义Drawable,绘制一个圆形的Drawable,并且它的半径会随着View的变化而变化。
//自定义Drawable
public class CustomDrawable extends Drawable {
private Paint mPaint;
public CustomDrawable(int color) {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(color);
}
@Override
public void draw(Canvas canvas) {
final Rect rect = getBounds();
float cx = rect.exactCenterX();
float cy = rect.exactCenterY();
canvas.drawCircle(cx, cy, Math.min(cx, cy), mPaint);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
invalidateSelf();
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
invalidateSelf();
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}