android 自定义圆环
16lz
2021-01-23
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 }}
更多相关文章
- Android 控件TextView的属性
- Android Zxing修改二维码中扫描框的大小仿微信
- android 动态改变控件大小的方法
- android开发:View中android:fadingEdge属性的作用
- EditText的字体和大小
- android属性android:largeHeap
- Android中如何比较两个时间值的大小.