android 自定义圆环
最近学了自定义控件,以前一直想写个圆环,最近粗粗写了个,以便记录.
public class RingProgressView extends View {
private float radius = 200; //圆半径
private float distance = 60;// 圆环
private Paint mCirclePaint;
private Paint textPaint;
private int vWidth, vHeight;
private RectF mRectF;
private int curProgress = 0;
private int oldProgress = 0;
private float textOffsetY;
private float vX, vY; //绘制的中心点
private String text = "0";
public RingProgressView(Context context) {
this(context, null);
}
public RingProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
//自定义属性的话可以自己找找attrs属性
initPaint();
}
private void initPaint() {
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
mCirclePaint.setStrokeCap(Paint.Cap.ROUND);
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(30);
textPaint.setTextAlign(Paint.Align.CENTER);
textOffsetY = (textPaint.descent() + textPaint.ascent()) / 2;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//测绘视图的大小
vWidth = resolveSize((int) (radius * 2), widthMeasureSpec);
vHeight = resolveSize((int) (radius * 2), heightMeasureSpec);
int thisX = vWidth - getPaddingLeft() - getPaddingRight();
int thisY = vHeight - getPaddingTop() - getPaddingBottom();
vX = thisX / 2;
vY = thisY / 2;
//当前圆直径大于视图时候 改变圆的大小
if (vWidth < radius * 2 || vHeight < radius * 2) {
if (thisX > thisY) {
radius = thisY / 2;
} else {
radius = thisX / 2;
}
}
//更改之后 改变圆环大小
if (radius != 200)
distance = radius / 6;
//自定义之后必须调用这个
setMeasuredDimension(vWidth, vHeight);
}
@Override
protected void onDraw(Canvas canvas) {
//绘制实心圆,中心圆的颜色
mCirclePaint.setStrokeWidth(0);
mCirclePaint.setStyle(Paint.Style.FILL);
mCirclePaint.setColor(0xFFF29B76);
canvas.drawCircle(vX, vY, radius, mCirclePaint);
//先绘制底部的360圆环,然后绘制滑动的圆环
mCirclePaint.setStyle(Paint.Style.STROKE);
mCirclePaint.setColor(Color.YELLOW);
mCirclePaint.setStrokeWidth(distance);
mRectF = new RectF(vX - radius + distance / 2, vY - radius + distance / 2, vX + radius - distance / 2, vY + radius - distance / 2);//定义一个矩形区域
canvas.drawArc(mRectF, 0, 360, false, mCirclePaint);
mCirclePaint.setColor(0xDDD12345);
canvas.drawArc(mRectF, -90, oldProgress, false, mCirclePaint);
//绘制百分比文字
canvas.drawText(text + "%", vX, vY - textOffsetY, textPaint);
}
public synchronized void setProgress(double progress) {
oldProgress = curProgress;
curProgress = (int) (progress * 360);
myHandler.removeCallbacksAndMessages(null);
if (oldProgress != curProgress)
oldProgress = 0;
myHandler.sendMessageDelayed(new Message(), 2);
}
private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (curProgress < oldProgress) {
removeCallbacksAndMessages(this);
} else if (curProgress >= oldProgress) {
oldProgress += 3;
if (oldProgress > curProgress)
oldProgress = curProgress;
text = String.format("%.1f", oldProgress / 3.6);
invalidate();
myHandler.sendMessageDelayed(new Message(), 1);
}
}
};
//可以设置圆环的一些属性
public void setRadius() {
//xxx
}
}