当前位置:

首页 > 系统应用 > 2.3.7 ProgressBar(进度条)

2.3.7 ProgressBar(进度条)

Process Lasso 专业版
Process Lasso 专业版

Process Lasso是一款功能Windows进程管理工具,可有效避免电脑出现蓝屏、假死等情况。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

立即下载
¥59
Windows 2026-09-24
正版软件 Windows Process 系统优化工具 专业版 进程管理

本节引言: 这一节要讲的是 Android 基本 UI 控件里的 ProgressBar,也就是常说的进度条。这个控件的使用场景其实非常多:比如用户登录时,后台正在发起请求、等待服务器返回结果,这时候往往就会用到进度条;又或者执行某些比较耗时的操作,用户需要等待较长一段时间,如果界面一点反馈都没有,

本文目录

    本节引言:

    这一节要讲的是 Android 基本 UI 控件里的 ProgressBar,也就是常说的进度条。这个控件的使用场景其实非常多:比如用户登录时,后台正在发起请求、等待服务器返回结果,这时候往往就会用到进度条;又或者执行某些比较耗时的操作,用户需要等待较长一段时间,如果界面一点反馈都没有,用户很容易误以为程序Crash了,或者手机卡死了,这对体验的影响是很明显的。所以,只要涉及耗时操作,通常都应该加上进度条,一方面让用户清楚知道程序还在运行,另一方面也能更直观地展示当前任务的执行进度。说白了,进度条带来的便利就在这里。好了,接下来正式进入本节内容。对了,ProgressBar 官方 API 文档:ProgressBar

    1.常用属性讲解与基础实例

    从官方文档,我们看到了这样一个类关系图:

    ProgressBar继承与View类,直接子类有AbsSeekBar和ContentLoadingProgressBar, 其中AbsSeekBar的子类有SeekBar和RatingBar,可见这二者也是基于ProgressBar实现的

    常用属性详解:

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

    对应的再Ja va中我们可调用下述方法:

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

    接下来来看看系统提供的默认的进度条的例子吧!

    系统默认进度条使用实例:

    运行效果图:

    实现布局代码:

    
    
    
    
    
    
        
    
    

    好吧,除了第二个能看,其他的就算了...系统提供的肯定是满足不了我们的需求的! 下面我们就来讲解下实际开发中我们对进度条的处理!

    2.使用动画来替代圆形进度条

    第一个方案是,使用一套连续图片,形成一个帧动画,当需要进度图的时候,让动画可见,不需要 的时候让动画不可见即可!而这个动画,一般是使用AnimationDrawable来实现的!好的,我们来 定义一个AnimationDrawable文件:

    PS:用到的图片素材:进度条图片素材打包.zip

    运行效果图:

    实现步骤:

    在res目录下新建一个:anim文件件,然后创建amin_pgbar.xml的资源文件:

      
      
      
          
          
          
          
          
          
          
          
          
          
          
     

    接着写个布局文件,里面仅仅有一个ImageView即可,用于显示进度条,把src设置为上述drawable资源即可! 最后到MainActivity.ja va

    public class MainActivity extends AppCompatActivity {
    private ImageView img_pgbar;
        private AnimationDrawable ad;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            img_pgbar = (ImageView) findViewById(R.id.img_pgbar);
            ad = (AnimationDrawable) img_pgbar.getDrawable();
            img_pgbar.postDelayed(new Runnable() {
                @Override
                public void run() {
                    ad.start();
                }
            }, 100);
        }
    }

    这里主要讲的是动画怎么启动,后面的使用场景就比较直接了:需要显示进度条时,把ImageView设为可见;不需要时,再把它隐藏起来就行。其实,ProgressBar 本身也提供了一个 indeterminateDrawable,只要把这个参数设成前面提到的动画资源,同样可以实现效果。不过要注意,进度条图案的尺寸没法直接改,通常还得在 Ja va 代码里处理。要是已经手动设置了宽高,尤其是尺寸设得偏大时,就可能出现多个进度条同时显示的情况,这一点需要根据实际效果自己权衡。

    3.自定义圆形进度条

    相信你看完2会吐槽,卧槽,这么坑爹,拿个动画来坑人,哈哈,实际开发中都这样,当然上述 这种情况只适用于不用显示进度的场合,如果要显示进度的场合就没用处了,好吧,接下来看下 网上一个简单的自定义圆形进度条!代码还是比较简单,容易理解,又兴趣可以看看,或者进行相关扩展~

    运行效果图:

    实现代码:

    自定义View类:

    /**
     * Created by Jay on 2015/8/5 0005.
     */
    public class CirclePgBar extends View {
    private Paint mBackPaint;
        private Paint mFrontPaint;
        private Paint mTextPaint;
        private float mStrokeWidth = 50;
        private float mHalfStrokeWidth = mStrokeWidth / 2;
        private float mRadius = 200;
        private RectF mRect;
        private int mProgress = 0;
        //目标值,想改多少就改多少
        private int mTargetProgress = 90;
        private int mMax = 100;
        private int mWidth;
        private int mHeight;
    public CirclePgBar(Context context) {
            super(context);
            init();
        }
    public CirclePgBar(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    public CirclePgBar(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    //完成相关参数初始化
        private void init() {
            mBackPaint = new Paint();
            mBackPaint.setColor(Color.WHITE);
            mBackPaint.setAntiAlias(true);
            mBackPaint.setStyle(Paint.Style.STROKE);
            mBackPaint.setStrokeWidth(mStrokeWidth);
    mFrontPaint = new Paint();
            mFrontPaint.setColor(Color.GREEN);
            mFrontPaint.setAntiAlias(true);
            mFrontPaint.setStyle(Paint.Style.STROKE);
            mFrontPaint.setStrokeWidth(mStrokeWidth);
    mTextPaint = new Paint();
            mTextPaint.setColor(Color.GREEN);
            mTextPaint.setAntiAlias(true);
            mTextPaint.setTextSize(80);
            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, mRadius, mBackPaint);
            canvas.drawArc(mRect, -90, angle, false, mFrontPaint);
            canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth, mHeight / 2 + mHalfStrokeWidth, mTextPaint);
            if (mProgress < mTargetProgress) {
                mProgress += 1;
                invalidate();
            }
    }
    public int getRealSize(int measureSpec) {
            int result = 1;
            int mode = MeasureSpec.getMode(measureSpec);
            int size = MeasureSpec.getSize(measureSpec);
    if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED) {
                //自己计算
                result = (int) (mRadius * 2 + mStrokeWidth);
            } else {
                result = size;
            }
    return result;
        }
    private void initRect() {
            if (mRect == null) {
                mRect = new RectF();
                int viewSize = (int) (mRadius * 2);
                int left = (mWidth - viewSize) / 2;
                int top = (mHeight - viewSize) / 2;
                int right = left + viewSize;
                int bottom = top + viewSize;
                mRect.set(left, top, right, bottom);
            }
        }
    }

    然后在布局文件中加上:

     

    就是这么简单~

    本节小结:

    本节给大家介绍了Android中的常用控件:ProgressBar讲解了基本用法,以及实际开发中 对于进度条的两种实现方法,第二个自定义进度条可以自行完善,然后用到实际开发中~! 好的,本节就到这里,谢谢~

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用 Pro
    相关文章 更多
    联发科天玑9600 Pro首发2nm:能效与游戏渲染技术详解
    联发科天玑9600 Pro首发2nm:能效与游戏渲染技术详解

    联发科宣布将于9月15日14:30发布天玑9600系列,其中Pro版采用台积电第二代2nm N2P工艺,为品牌首款2nm手机芯片。相比N3E,该制程在相同功耗下性能提升最高18%,功耗降低约36%。芯片主打能效、游戏光追及4K 240fps影像能力,标准版则基于3nm工艺。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?