欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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度开始才是垂直上方。
效果图:

Android View实现圆形进度条

自定义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();
    }
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关标签: Android 进度条