Android View实现圆形进度条
程序员文章站
2022-03-25 10:57:41
本文实例为大家分享了android view实现圆形进度条的具体代码,供大家参考,具体内容如下主要涉及到下面几个方法:// 画圆canvas.drawcircle// 画圆弧canvas.drawar...
本文实例为大家分享了android view实现圆形进度条的具体代码,供大家参考,具体内容如下
主要涉及到下面几个方法:
// 画圆 canvas.drawcircle // 画圆弧 canvas.drawarc // 画文本 canvas.drawtext // 抗锯齿 paint.setantialias(true); // 设置颜色 paint.setcolor(getresources().getcolor(mfgcolor, null));
其次就是对坐标的计算,还有注意就是画圆弧的时候,起始从-90度开始才是垂直上方。
效果图:
自定义view:
public class myview extends view { // 线宽度 private static final int mstrokewidth = 50; private int mval = 0; private static final int mmaxval = 200; private int mggcolor = r.color.arcbg; private int mfgcolor = r.color.arcfg; public myview(context context) { super(context); } public myview(context context, @nullable attributeset attrs) { super(context, attrs); } // 设置值 public void setprogressvalue(int val){ this.mval = val; invalidate(); } @override protected void ondraw(canvas canvas) { super.ondraw(canvas); int width = getmeasuredwidth(); int height = getmeasuredheight(); drawbgcircle(canvas, width, height); drawfgarc(canvas, width, height); drawtext(canvas, width, height); } // 文本 private void drawtext(canvas canvas, int width, int height) { paint paint = new paint(); paint.setantialias(true); paint.setcolor(getresources().getcolor(mfgcolor, null)); paint.settextsize(120); int percent = (int) (( mval / (float) mmaxval ) * 100); canvas.drawtext(percent + "%", (width - paint.measuretext(percent + "%")) / 2, (height + paint.measuretext("%")) / 2, paint); } // 圆弧 private void drawfgarc(canvas canvas, int width, int height) { paint paint = new paint(); paint.setcolor(getresources().getcolor(mfgcolor, null)); paint.setstyle(paint.style.stroke); paint.setstrokewidth(mstrokewidth); paint.setantialias(true); rectf mrectf = new rectf(mstrokewidth, mstrokewidth, width - mstrokewidth, height - mstrokewidth); int sweepangle = (int) (360 * mval / (float) mmaxval); canvas.drawarc(mrectf, -90, sweepangle, false, paint); } // 底部圆形 private void drawbgcircle(canvas canvas, int width, int height) { int r = (width - 2 * mstrokewidth) / 2; paint cpaint = new paint(); cpaint.setcolor(getresources().getcolor(mggcolor, null)); cpaint.setstyle(paint.style.stroke); cpaint.setstrokewidth(mstrokewidth); cpaint.setantialias(true); canvas.drawcircle(width / 2, height / 2, r, cpaint); } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { super.onmeasure(widthmeasurespec, heightmeasurespec); int width = getsize(widthmeasurespec, 200); int height = getsize(heightmeasurespec, 200); setmeasureddimension(width, height); } private int getsize(int widthmeasurespec, int defultsize) { int realsize = defultsize; int mode = measurespec.getmode(widthmeasurespec); int size = measurespec.getsize(widthmeasurespec); switch (mode){ case measurespec.unspecified: realsize = defultsize; break; case measurespec.at_most: realsize = size; break; case measurespec.exactly: realsize = size; break; } return realsize; } }
然后在布局文件中引用:
<com.weizu.myapplication.view.myview android:id="@+id/myview" android:layout_width="150dp" android:layout_height="150dp" app:layout_constraintbottom_tobottomof="parent" app:layout_constraintend_toendof="parent" app:layout_constraintstart_tostartof="parent" app:layout_constrainttop_totopof="parent" />
最后,我们设置其点击效果,并开始耗时操作模拟:
myview view = findviewbyid(r.id.myview); view.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { new thread(new runnable() { @override public void run() { int val = 0; while(val <= 200){ view.setprogressvalue(val); val++; try { thread.sleep(20); } catch (interruptedexception e) { e.printstacktrace(); } } } }).start(); } });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: iPad mini 6全细节:8.4英寸全面屏配A14芯片
下一篇: 鸡腿肉炖多久能熟