Android - 进度条的使用

2024-05-14 1018阅读

文章目录

  • 一、进度条的属性和方法
    • 1.控件常用属性
    • 2.控件常用方法
    • 二、系统提供的进度条
      • 1.圆形进度条用法:
      • 2.横线进度条用法
      • 三、自定义进度条
      • 总结

        一、进度条的属性和方法

        1.控件常用属性

        android:max:进度条的最大值
        android:progress:进度条已完成进度值
        android:progressDrawable:设置轨道对应的Drawable对象
        android:indeterminate:如果设置成true,则进度条不精确显示进度
        android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象
        android:indeterminateDuration:设置不精确显示进度的持续时间
        android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!
        

        2.控件常用方法

        getMax():返回这个进度条的范围的上限
        getProgress():返回进度
        getSecondaryProgress():返回次要进度
        incrementProgressBy(int diff):指定增加的进度
        isIndeterminate():指示进度条是否在不确定模式下
        setIndeterminate(boolean indeterminate):设置不确定模式下
        

        二、系统提供的进度条

        系统系统了四种进度条:分别是Small,Inverse,Large,Horizontal,前三种是圆形,最后一种是横线形,直接style引用即可

        Android - 进度条的使用
        (图片来源网络,侵删)

        三种圆形的进度条无法显示进度

        1.圆形进度条用法:

         
        

        2.横线进度条用法

        布局文件

         
        

        java文件

        下面的代码中,首先做了一个定时器模拟事务返回进度,每秒钟返回一次当前事务的进度,第二个定时器搭配hander每秒钟更新一次UI上显示的进度条

        hander里面:

        第一步获取以下当前进度条显示的进度,

        第二步通过事务返回的进度计算在进度条上应该显示的进度,

        第三步用应该显示的最新进度减去当前已经显示的进度获取当前进度条应该增加的进度

        第四步调用进度条的incrementProgressBy方法更新进度条显示

        public class MainActivity extends AppCompatActivity {
            ProgressBar prog;
            int a;     //事务执行的总进度
            int b = 0;     //事务执行的初始进度
            int c;     //进度条的总进度
            int h;      //进度条的当前进度
            Handler myHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    if (msg.what == 111) {
                        //获取进度条当前进度
                        h = prog.getProgress();
                        //计算当前实际进度
                        double e = (double) b / a;
                        double f = c * e;
                        int g = (int) f;
                        //计算要增加的进度
                        int m = g - h;
                        prog.incrementProgressBy(m);    //增加进度显示
                    }
                }
            };
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                prog = (ProgressBar) findViewById(R.id.prog);
                c = prog.getMax();
                //执行事务,每秒钟返回一次事务执行进度
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        a = 500;
                        b++;
                        if (b > a) {
                            cancel();
                        }
                    }
                }, 0, 1000);
                //每秒钟将事务返回的进度值通过hander更新到UI显示中
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        if (b > a) {
                            cancel();
                        }else{
                            //定时循环执行的内容
                            myHandler.sendEmptyMessage(111);
                        }
                    }
                }, 0, 1000);
            }
        

        三、自定义进度条

        自定义一个类继承View绘制圆形进度条,然后引用,下面的代码可直接复制使用,代码中我暴露出了五个参数可以在使用时修改,java中调用先使用setmTargetProgress()方法修改进度值,然后调用invalidate()重新绘制view即可。

        CustomPgBar.java

        public class CustomPgBar extends View {
            private Paint mBackPaint;
            private Paint mFrontPaint;
            private Paint mTextPaint;
            private RectF mRect;
            private int mProgress = 0;
            private int mWidth;
            private int mHeight;
            private int mMax = 100;         //总进度值
            //以下五个参数已暴露出去,使用时可修改
            private int mTargetProgress = 0;    //进度值
            private float mRadius = 200;    //圆形大小
            private int mTextPaintColor = Color.GREEN;  //绘制文本字体颜色
            private int mFrontPaintColor = Color.GREEN; //绘制进度颜色
            private int mBackPaintColor = Color.BLUE;   //绘制总进度颜色
            private float pTextSize = (float) (mRadius * 0.6);     //绘制文本字体大小
            private float mStrokeWidth = (float) (mRadius * 0.25);    //进度粗细
            private float mHalfStrokeWidth = mStrokeWidth / 2;
            public CustomPgBar(Context context) {
                super(context);
                init();
            }
            public CustomPgBar(Context context, AttributeSet attrs) {
                super(context, attrs);
                init();
            }
            public CustomPgBar(Context context, AttributeSet attrs, int defStyleAttr) {
                super(context, attrs, defStyleAttr);
                init();
            }
            //完成相关参数初始化
            private void init() {
                //总进度画笔
                mBackPaint = new Paint();
                mBackPaint.setColor(getmBackPaintColor());
                mBackPaint.setAntiAlias(true);
                mBackPaint.setStyle(Paint.Style.STROKE);
                mBackPaint.setStrokeWidth(mStrokeWidth);
                //进度画笔
                mFrontPaint = new Paint();
                mFrontPaint.setColor(getmFrontPaintColor());
                mFrontPaint.setAntiAlias(true);
                mFrontPaint.setStyle(Paint.Style.STROKE);
                mFrontPaint.setStrokeWidth(mStrokeWidth);
                //文本画笔
                mTextPaint = new Paint();
                mTextPaint.setColor(getmTextPaintColor());
                mTextPaint.setAntiAlias(true);
                mTextPaint.setTextSize(pTextSize);
                mTextPaint.setTextAlign(Paint.Align.CENTER);
            }
            //重写测量大小的onMeasure方法和绘制View的核心方法onDraw()
            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                mWidth = getRealSize(widthMeasureSpec);
                mHeight = getRealSize(heightMeasureSpec);
                setMeasuredDimension(mWidth, mHeight);
            }
            @Override
            protected void onDraw(Canvas canvas) {
                initRect();
                float angle = mProgress / (float) mMax * 360;
                canvas.drawCircle(mWidth / 2, mHeight / 2, getmRadius(), mBackPaint);
                canvas.drawArc(mRect, -90, angle, false, mFrontPaint);
                canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth, mHeight / 2 + mHalfStrokeWidth, mTextPaint);
                if (mProgress  
        

        activity_main.xml引用

            
                
            
        

        MainActivity.java

        public class MainActivity extends AppCompatActivity {
            CustomPgBar cusbar;
            int a;     //事务执行的总进度
            int b = 0;     //事务执行的初始进度
            int c;     //进度条的总进度
            Handler myHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    if (msg.what == 111) {
                        //计算当前实际进度
                        double e = (double) b / a;
                        double f = c * e;
                        int g = (int) f;
                        cusbar.setmTargetProgress(g);   //修改进度值
                        cusbar.invalidate();    //重新绘制viwe
                    }
                }
            };
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                cusbar = (CustomPgBar) findViewById(R.id.cusbar);
                c = cusbar.getmMax();
                //执行事务,每秒钟返回一次事务执行进度
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        a = 200;
                        b++;
                        if (b >= a) {
                            cancel();
                        }
                    }
                }, 0, 1000);
                //每秒钟将事务返回的进度值通过hander更新到UI显示中
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        if (b > a) {
                            cancel();
                        } else {
                            //定时循环执行的内容
                            myHandler.sendEmptyMessage(111);
                        }
                    }
                }, 0, 1000);
            }
        }
        

        总结

        以上就是今天要讲的内容。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]