先上效果图:
private Paint paint;
public MyView(Context context) {
this(context, null);
}
public MyView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paint = new Paint();
paint.setColor(context.getResources().getColor(R.color.yellow_ffd700));
//Style 具体来说有三种:
// FILL, STROKE 和 FILL_AND_STROKE 。
// FILL 是填充模式,
// STROKE 是画线模式(即勾边模式),
// FILL_AND_STROKE 是两种模式一并使用:既画线又填充。它的默认值是 FILL,填充模式。
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(100);//描边 占据绘画图形以外的空间,占width/2
paint.setAntiAlias(true);//抗锯齿
}
以上代码除了注意Paint的基本设置,还需关注自定义View重写的三个构造方法,第一个是代码new对象时候调用,第二个是布局文件中时候调用,第三个是布局文件中有style属性时候调用。1调2调3,具体处理都放在第三个构造函数。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setStyle(Paint.Style.FILL);
canvas.drawCircle(500, 800, 300, paint);
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(100, 100, 200, 250, paint);
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(300, 100, 400, 200, paint);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
//800,100确定左上角,距离左边800,上面100
//900,200确定右下角,距离左边900,上面200
RectF rectF = new RectF(800, 100, 900, 200);
canvas.drawRect(rectF, paint);
}