简单的自定义Drawable
圆角矩形Drawable:
public class RoundRectImageDrawable extends Drawable {
private Paint mPaint;
private Bitmap mBitmap;
//绘制区域
private RectF rectF;
//圆角半径
private float rx = 30;
private float ry = 30;
public RoundRectImageDrawable(Bitmap bitmap) {
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setShader(bitmapShader);
rectF = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
mBitmap = bitmap;
}
/**
* 绘制其边界(通过setBounds设置)尊重可选的效果作为alpha(通过setAlpha设置)和颜色过滤器(通过setColorFilter设置)。
*
* @param canvas
*/
@Override
public void draw(Canvas canvas) {
canvas.drawRoundRect(rectF, rx, ry, mPaint);
}
/**
* 为Drawable指定一个边界矩形。 这是drawable的地方将在draw()方法被调用时绘制。
*
* @param left
* @param top
* @param right
* @param bottom
*/
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
rectF.set(left, top, right, bottom);
}
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
圆形Drawable:
public class CircleImageDrawable extends Drawable {
private Paint mPaint;
private Bitmap mBitmap;
private RectF rectF;
private int R;
public CircleImageDrawable(Bitmap bitmap) {
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setShader(bitmapShader);
rectF = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
mBitmap = bitmap;
R = Math.min(bitmap.getWidth(), bitmap.getHeight());
}
@Override
public void draw(Canvas canvas) {
// canvas.drawRoundRect(rectF, 30, 30, mPaint);
canvas.drawCircle((rectF.right + rectF.left) / 2, (rectF.top + rectF.bottom) / 2, R / 2, mPaint);
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
rectF.set(left, top, right, bottom);
R = Math.min(right - left, bottom - top);
}
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
mPaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
通过以上简单例子可以定义出其他形状的Drawable~