继承TextView类,
首先是构造方法, 两参()构造是解析布局文件时调用的, 所以相关的操作在这个方法中定义.
在onDraw()方法里,
- 使用canvas.drawCircle(float cx, float cy, float radius, Paint paint)方法绘制一个圆. 圆的颜色由Paint参数决定. 在初始化以及设置颜色的方法中设置Paint的颜色参数.
- 使用canvas.drawBitmap(Bitmat bitmap, float left, float top, Paint paint); 方法绘制背景之上的图案.
使用validate()方法会造成View的重绘, 并重新调用onDraw方法.
附上完整代码:
public class MyTextView extends TextView {
private static final String NAME_SPACE = "http://demo.com/src";
private Paint mBgPaint = new Paint();
private Bitmap mForePic;
private float mBgRadius = -1;
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
mBgPaint.setColor(attrs.getAttributeIntValue(NAME_SPACE, "backgroundColor", Color.TRANSPARENT));
int forePicId = attrs.getAttributeResourceValue(NAME_SPACE, "forepic", -1);
mBgRadius = attrs.getAttributeIntValue(NAME_SPACE, "bgraidus", -1);
setForePic(forePicId);
setBackgroundRadius(mBgRadius);
}
public MyTextView(Context context) {
super(context);
init();
}
private void init() {
mBgPaint.setColor(Color.TRANSPARENT);
mBgPaint.setAntiAlias(true);
this.setGravity(Gravity.CENTER);
}
@Override
public void setBackgroundColor(int color) {
mBgPaint.setColor(color);
}
@Override
public void onDraw(Canvas canvas) {
//如果没有设置半径, 默认为View的宽高的一半
if (mBgRadius == -1) {
mBgRadius = Math.max(getWidth(), getHeight()) / 2;
}
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBgRadius, mBgPaint);
if (mForePic != null) {
super.setText("");
canvas.drawBitmap(mForePic,
(getMeasuredWidth() - mForePic.getWidth()) / 2,
(getMeasuredHeight() - mForePic.getHeight()) / 2, null);
}
super.onDraw(canvas);
}
/**
* 设置前景图片
*
* @param resId
* 图片资源的id
*/
public void setForePic(int resId) {
mForePic = BitmapFactory.decodeResource(getResources(), resId);
//invalidate();
}
/**
* 设置前景图片
*
* @param drawable
*/
public void setForePic(Drawable drawable) {
mForePic = ((BitmapDrawable) drawable).getBitmap();
invalidate();
}
/**
* 设置背景圆形的半径
* @param radius
*/
public void setBackgroundRadius(float radius) {
this.mBgRadius = radius;
}