Android自定义圆环式进度条
程序员文章站
2022-06-09 16:28:29
安卓自定义圆环式进度条,供大家参考,具体内容如下需求是实现一个圆环式中间带有进度的进度条,自己动手实现一个package com.djt.aienglish.widget;import android...
安卓自定义圆环式进度条,供大家参考,具体内容如下
需求是实现一个圆环式中间带有进度的进度条,自己动手实现一个
package com.djt.aienglish.widget; import android.content.context; import android.content.res.typedarray; import android.graphics.canvas; import android.graphics.paint; import android.graphics.rectf; import android.text.textutils; import android.util.attributeset; import android.view.view; import com.djt.aienglish.r; /** * @author qiu * @date 2020/3/12 13:51 */ public class circlepgbar extends view { private int mheight = 0; private int mwidth = 0; // 画圆环的画笔 private paint mringpaint; // 画圆环的画笔背景色 private paint mringpaintbg; // 画字体的画笔 private paint mtextpaint; // 圆环颜色 private int mringcolor; // 圆环背景颜色 private int mringbgcolor; // 半径 private float mradius; // 圆环半径 private float mringradius; // 圆环宽度 private float mstrokewidth; // 圆心x坐标 private int mxcenter; // 圆心y坐标 private int mycenter; // 字的长度 private float mtxtwidth; // 字的高度 private float mtxtheight; // 总进度 private int max = 100; // 当前进度 private int progress; private string text; public circlepgbar(context context, attributeset attrs) { super(context, attrs); // 获取自定义的属性 initattrs(context, attrs); initvariable(); } /** * 属性 */ private void initattrs(context context, attributeset attrs) { typedarray typearray = context.gettheme().obtainstyledattributes(attrs, r.styleable.taskscompletedview, 0, 0); mstrokewidth = typearray.getdimension(r.styleable.taskscompletedview_circlewidth, 0); mringcolor = typearray.getcolor(r.styleable.taskscompletedview_ringcolor, 0xffffffff); mringbgcolor = typearray.getcolor(r.styleable.taskscompletedview_ringbgcolor, 0xffffffff); text = typearray.getstring(r.styleable.taskscompletedview_text); max = typearray.getinteger(r.styleable.taskscompletedview_max, 0); progress = typearray.getinteger(r.styleable.taskscompletedview_progress, 0); } /** * 初始化画笔 */ private void initvariable() { //外圆弧背景 mringpaintbg = new paint(); mringpaintbg.setantialias(true); mringpaintbg.setcolor(mringbgcolor); mringpaintbg.setstyle(paint.style.stroke); mringpaintbg.setstrokewidth(mstrokewidth); //外圆弧 mringpaint = new paint(); mringpaint.setantialias(true); mringpaint.setcolor(mringcolor); mringpaint.setstyle(paint.style.stroke); mringpaint.setstrokewidth(mstrokewidth); //mringpaint.setstrokecap(paint.cap.round);//设置线冒样式,有圆 有方 //中间字 mtextpaint = new paint(); mtextpaint.setantialias(true); mtextpaint.setstyle(paint.style.fill); mtextpaint.setcolor(mringcolor); invalidate(); } //测量 @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { super.onmeasure(widthmeasurespec, heightmeasurespec); //实际测量宽高 mheight = getmeasuredheight(); mwidth = getmeasuredwidth(); if (mwidth > mheight) { mradius = mheight / 2; } else { mradius = mwidth / 2; } //半径 mringradius = mradius - mstrokewidth / 2; //文字宽高测量 mtextpaint.settextsize(mradius / 2); paint.fontmetrics fm = mtextpaint.getfontmetrics(); mtxtheight = (int) math.ceil(fm.descent - fm.ascent); } /** * 画图 */ @override protected void ondraw(canvas canvas) { mxcenter = mwidth / 2; mycenter = mheight / 2; //外圆弧背景 rectf rectbg = new rectf(mxcenter - mringradius, mycenter - mringradius, mxcenter + mringradius, mycenter + mringradius); canvas.drawarc(rectbg, 0, 360, false, mringpaintbg); //外圆弧//进度 if (progress > 0) { rectf oval = new rectf(mxcenter - mringradius, mycenter - mringradius, mxcenter + mringradius, mycenter + mringradius); canvas.drawarc(oval, -90, ((float) progress / max) * 360, false, mringpaint); } //字体 if(!textutils.isempty(text)) { mtxtwidth = mtextpaint.measuretext(text, 0, text.length()); canvas.drawtext(text, mxcenter - mtxtwidth / 2, mycenter + mtxtheight / 4, mtextpaint); } } /** * 设置进度 * * @param progress */ public void setprogress(int progress) { this.progress = progress; postinvalidate();//重绘 } /** * 设置最大值 * * @param max */ public void setmax(int max) { this.max = max; postinvalidate(); } /** * 设置文字内容 * * @param text */ public void settext(string text) { this.text = text; postinvalidate(); } }
别忘记在value下的attr.xml中加入默认配置属性
<!--圆弧进度条--> <declare-styleable name="taskscompletedview"> <attr name="circlewidth" format="dimension" /> <attr name="ringcolor" format="color" /> <attr name="ringbgcolor" format="color" /> <attr name="text" format="string" /> <attr name="progress" format="integer" /> <attr name="max" format="integer" /> </declare-styleable>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。