千家信息网

Android中怎么自定义view实现圆环进度条效果

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要讲解了"Android中怎么自定义view实现圆环进度条效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android中怎么自定义vie
千家信息网最后更新 2026年11月03日Android中怎么自定义view实现圆环进度条效果

这篇文章主要讲解了"Android中怎么自定义view实现圆环进度条效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Android中怎么自定义view实现圆环进度条效果"吧!

核心代码

自定义view的属性

                                                                                                        

自定义view

package com.czhappy.ringprogressdemo.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Typeface;import android.util.AttributeSet;import android.util.Log;import android.view.View;import com.czhappy.ringprogressdemo.R;/** * Description: * User: chenzheng * Date: 2017/2/10 0010 * Time: 15:11 */public class RingProgressBar extends View {    /**     * 画笔对象的引用     */    private Paint ringPaint;    private Paint ringProgressPaint;    private Paint txtPaint;    /**     * 圆环的颜色     */    private int ringColor;    /**     * 圆环进度的颜色     */    private int ringProgressColor;    /**     * 中间进度百分比的字符串的颜色     */    private int textColor;    /**     * 中间进度百分比的字符串的字体     */    private float textSize;    /**     * 圆环的宽度     */    private float ringWidth;    /**     * 最大进度     */    private int max;    /**     * 当前进度     */    private int progress;    /**     * 是否显示中间的进度     */    private boolean textIsDisplayable;    private Context mContext;    /**     * 进度的风格,实心或者空心     */    private int style;    public static final int STROKE = 0;    public static final int FILL = 1;    public RingProgressBar(Context context) {        this(context, null);    }    public RingProgressBar(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public RingProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        this.mContext = context;        // 获取自定义的属性        initAttrs(context, attrs);        initPaint();    }    private void initAttrs(Context context, AttributeSet attrs) {        TypedArray mTypedArray = context.obtainStyledAttributes(attrs,                R.styleable.RingProgressBar);        //获取自定义属性和默认值        ringColor = mTypedArray.getColor(R.styleable.RingProgressBar_ringColor, Color.GRAY);        ringProgressColor = mTypedArray.getColor(R.styleable.RingProgressBar_ringProgressColor, Color.GREEN);        textColor = mTypedArray.getColor(R.styleable.RingProgressBar_textColor, Color.GREEN);        textSize = mTypedArray.getDimension(R.styleable.RingProgressBar_textSize, 16);        ringWidth = mTypedArray.getDimension(R.styleable.RingProgressBar_ringWidth, 5);        max = mTypedArray.getInteger(R.styleable.RingProgressBar_max, 100);        textIsDisplayable = mTypedArray.getBoolean(R.styleable.RingProgressBar_textIsDisplayable, true);        style = mTypedArray.getInt(R.styleable.RingProgressBar_style, 0);        //资源回收        mTypedArray.recycle();    }    /**     * 初始化画笔     */    private void initPaint() {        //圆环画笔        ringPaint = new Paint();        ringPaint.setColor(ringColor); //设置圆环的颜色        ringPaint.setStyle(Paint.Style.STROKE); //设置空心        ringPaint.setStrokeWidth(ringWidth); //设置圆环的宽度        ringPaint.setAntiAlias(true);  //消除锯齿        //圆环进度画笔        ringProgressPaint = new Paint();        ringProgressPaint.setColor(ringProgressColor); //设置圆环的颜色        ringProgressPaint.setStrokeWidth(ringWidth); //设置圆环的宽度        ringProgressPaint.setAntiAlias(true);  //消除锯齿        switch (style) {            case STROKE:                ringProgressPaint.setStyle(Paint.Style.STROKE);                break;            case FILL:                ringProgressPaint.setStyle(Paint.Style.FILL_AND_STROKE);                break;        }        //百分比文字画笔        txtPaint = new Paint();        txtPaint.setColor(textColor);        txtPaint.setTextSize(textSize);        txtPaint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        //圆心坐标        int mXCenter = getWidth() / 2;        int mYCenter = getHeight() / 2;        int radius = (int) (mXCenter - ringWidth / 2); //圆环的半径        //绘制圆环        canvas.drawCircle(mXCenter, mYCenter, radius, ringPaint);        //绘制圆环进度        RectF oval = new RectF(mXCenter - radius, mYCenter - radius, mXCenter                + radius, mYCenter + radius);  //用于定义的圆弧的形状和大小的界限        switch (style) {            case STROKE:                canvas.drawArc(oval, -90, 360 * progress / max, false, ringProgressPaint);  //根据进度画圆弧                break;            case FILL:                if (progress != 0)                    canvas.drawArc(oval, -90, 360 * progress / max, true, ringProgressPaint);  //根据进度画圆弧                break;        }        //绘制百分比数字        //文字绘制        String txt = progress  + "%";        //文字的长度        float mTxtWidth = txtPaint.measureText(txt, 0, txt.length());        Log.e("tag", textIsDisplayable+","+progress+(style==STROKE));        if(textIsDisplayable && progress!=0 && style==STROKE){            canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter+textSize/2, txtPaint);        }    }    public synchronized int getMax() {        return max;    }    /**     * 设置进度的最大值     * @param max     */    public synchronized void setMax(int max) {        if(max < 0){            throw new IllegalArgumentException("max not less than 0");        }        this.max = max;    }    /**     * 获取进度.需要同步     * @return     */    public synchronized int getProgress() {        return progress;    }    /**     * 设置进度,此为线程安全控件,由于考虑多线程的问题,需要同步     * 刷新界面调用postInvalidate()能在非UI线程刷新     * @param progress     */    public synchronized void setProgress(int progress) {        if(progress < 0){            throw new IllegalArgumentException("progress not less than 0");        }        if(progress > max){            progress = max;        }        if(progress <= max){            this.progress = progress;            postInvalidate();        }    }    public int getRingColor() {        return ringColor;    }    public void setRingColor(int ringColor) {        this.ringColor = ringColor;    }    public int getRingProgressColor() {        return ringProgressColor;    }    public void setRingProgressColor(int ringProgressColor) {        this.ringProgressColor = ringProgressColor;    }    public int getTextColor() {        return textColor;    }    public void setTextColor(int textColor) {        this.textColor = textColor;    }    public float getTextSize() {        return textSize;    }    public void setTextSize(float textSize) {        this.textSize = textSize;    }    public float getRingWidth() {        return ringWidth;    }    public void setRingWidth(float roundWidth) {        this.ringWidth = roundWidth;    }}

MainActivity.java

package com.czhappy.ringprogressdemo.activity;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import com.czhappy.ringprogressdemo.R;import com.czhappy.ringprogressdemo.view.RingProgressBar;public class MainActivity extends AppCompatActivity {    private RingProgressBar myProgress;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myProgress = (RingProgressBar) findViewById(R.id.myProgress);    }    public void beginAnim(View view){        new Thread(){            @Override            public void run() {                super.run();                for(int i=0; i<=60; i++){                    try {                        Thread.sleep(20);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    myProgress.setProgress(i);                }            }        }.start();    }}

布局文件

    

感谢各位的阅读,以上就是"Android中怎么自定义view实现圆环进度条效果"的内容了,经过本文的学习后,相信大家对Android中怎么自定义view实现圆环进度条效果这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

进度 圆环 画笔 颜色 效果 百分 百分比 圆弧 宽度 属性 文字 线程 学习 最大 内容 字体 字符 字符串 锯齿 问题 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 中国互联网科技工作委员会毛军 重生之互联网科技帝国 互联网电商科技 金诺互联网科技 互联网与科技发展 北京互联网络科技有限公司 顺网科技2021年互联网排名 互联网时代科技改变生活 互联网科技有哪些公司 千方科技属于互联网企业吗 青岛科技大学互联网大赛研究生 想开互联网科技公司怎么样 互联网时代的科技公司 合肥互联网科技公司公章图片 南通创西澳互联网科技有限公司 北京市互联网新科技 唐山双旺合互联网科技产业园 数字互联网科技有限公司 绵阳真晨互联网科技有限公司 重生之互联网科技帝国 厦门中拓互联网络科技有限公司 浩特互联网科技 互联网科技股有哪些 速维有品互联网信息科技(苏州)有限公司 互联网保险科技创业 翼展科技 首家互联网医院 世界互联网领先科技成果获奖 工业互联网山东科技大学 上海旺乐尼互联网科技有限公司
0