1. Demo: 自定义一个 Drawable
需求:绘制一个圆形的 Drawable,半径会随着 View 的变化而变化,这种 Drawable 可以作为 View 的通用背景
实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34public 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) { // draw 是最重要的方法
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 cf) {
mPaint.setColorFilter(cf);
invalidateSelf();
}
@Override
public int getOpacity() {
// not sure, to be safe
return PixelFormat.TRANSLUCENT;
}
}- 需要注意的是,当自定义的 Drawable 有固有大小时最好重写
getIntrinsicWidth()
和getIntrinsicHeight()
这两个方法,因为它会影响到 View 的 wrap_content 布局。比如自定义的 Drawable 是绘制一张图片,那么这个 Drawable 的内部大小就可以选用图片的大小 - 当没有重写这两个方法时,它的内部大小为 -1,即内部宽度和高度都为 -1。内部大小不等于 Drawable 的实际区域大小,Drawable 的实际区域大小可以通过它的
getBounds()
方法获得,一般来说它和 View 的尺寸相同
- 需要注意的是,当自定义的 Drawable 有固有大小时最好重写