0%

Android 的 Drawable(三):自定义 Drawable

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
    34
    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) { // 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 的尺寸相同
-------------------- 本文结束感谢您的阅读 --------------------