以前 使用drawable 都是放在drawable文件夹下,作为背景图的简单使用。后来发现可自定义drawable,而且不用考虑onMeasure,onLayout的重写,只需要考虑onDraw()即可。
drawable相对于view 是轻量级的,使用相对于View 比较简单,因此以后要改掉View first 思想为Drawable First.
下面就是简单自定义drawable的例子:
public class RoundImageDrawable extends Drawable {
private Bitmap mBitmap ;
private Paint mPaint;
private int mWidth;
public RoundImageDrawable(Bitmap bitmap) {
this.mBitmap = bitmap;
//构造渲染器BitmapShader
BitmapShader mBitmapsShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setShader(mBitmapsShader);
mWidth = Math.min(mBitmap.getWidth(), mBitmap.getHeight());
}
@Override
public void draw(Canvas canvas) {
canvas.drawCircle(mWidth/2, mWidth/2, mWidth/2, mPaint);
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
mPaint.setColorFilter(cf);
}
@Override
public int getOpacity() {
// TODO Auto-generated method stub
return PixelFormat.TRANSLUCENT;
}
@Override
public int getIntrinsicWidth() {
// TODO Auto-generated method stub
return mWidth;
}
@Override
public int getIntrinsicHeight() {
// TODO Auto-generated method stub
return mWidth;
}
核心代码就是draw了,setAlpha、setColorFilter、getOpacity、draw这几个方法是必须实现的,不过除了draw以为,其他都很简单。getIntrinsicWidth、getIntrinsicHeight主要是为了在View使用wrap_content的时候,提供一下尺寸,默认为-1可不是我们希望的。setBounds就是去设置下绘制的范围。