自定义view第三种是:完全自定义
效果如下:
需要解决的问题:
1 view的测量 onMeasure()
2 view的绘制onDraw()
3 如果需要变换图形,需要使用invalid更新,可以实现动态的效果
public class MyView extends View {
//view测绘的大小
//内圆部分
private int mMeasureWidth,mMeasureHeight;
private Paint mCirclePaint;
private float mCircleXY;
private float mCircleRadis;
//外圈部分
private Paint mArcPaint;
private RectF mArcRectF;
private float mSweepAngle;
//扫过的弧度
private float mSweepValue = 50;
//文字部分
private Paint mTextPaint;
private String mShowText;
private float mShowTextSize;
//下面的构造方法 不要删除
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//这里处理一些绘画
// 绘制圆api 参数 圆心X,Y 半径 画笔
canvas.drawCircle(mCircleXY, mCircleXY, mCircleRadis, mCirclePaint);
// 绘制弧线
canvas.drawArc(mArcRectF, 270, mSweepAngle, false, mArcPaint);
// 绘制文字
canvas.drawText(mShowText, 0, mShowText.length(),
mCircleXY, mCircleXY + (mShowTextSize / 4), mTextPaint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mMeasureWidth=MeasureSpec.getSize(widthMeasureSpec);
mMeasureHeight=MeasureSpec.getSize(heightMeasureSpec);
//设置测绘尺寸
setMeasuredDimension(mMeasureWidth,mMeasureHeight);
initView();
}
private void initView(){
float lenght=0;
lenght=Math.min(mMeasureWidth,mMeasureHeight);
//圆心坐标
mCircleXY=lenght/2;
mCircleRadis=(float) (lenght * 0.5 / 2);
mCirclePaint=new Paint();
//防锯齿效果
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(getResources().getColor(android.R.color.holo_blue_bright));
mArcRectF=new RectF(
(float) (lenght * 0.1),
(float) (lenght * 0.1),
(float) (lenght * 0.9),
(float) (lenght * 0.9));
mSweepAngle = (mSweepValue / 100f) * 360f;
//画圆
mArcPaint = new Paint();
mArcPaint.setAntiAlias(true);
mArcPaint.setColor(getResources().getColor(
android.R.color.holo_blue_bright));
mArcPaint.setStrokeWidth((float) (lenght * 0.1));
//空心
mArcPaint.setStyle(Paint.Style.STROKE);
//文字部分
mShowText = setShowText();
mShowTextSize = setShowTextSize();
mTextPaint = new Paint();
mTextPaint.setTextSize(mShowTextSize);
mTextPaint.setTextAlign(Paint.Align.CENTER);
}
private String setShowText() {
this.invalidate();
return "Android Skill";
}
private float setShowTextSize() {
this.invalidate();
return 50;
}
//提供外部接口 设置弧度值
public void setSweepValue(float sweepValue) {
if (sweepValue != 0) {
mSweepValue = sweepValue;
} else {
mSweepValue = 25;
}
this.invalidate();
}
}
整个绘制过程都比较简单,需要注意的是
view的默认构造方法要保留,否则会出错