今天要学的是一个特定场合要用到的控件——进度条控件。进度条的作用不言而喻,而在实际使用中,通常会有两种类型的进度条:横向进度条和圆形进度条。当然,ProgressBar 也是支持这两种类型的,可以应对大多数的开发场景。

1. ProgressBar 的特性

ProgressBar 是一个图形类型的控件,用来展示当前进度,可以是下载、跳转、切换、保存等等任何可能比较耗时的任务,它在很多场景下对用户体验是有很大帮助的,所以我们千万不能忽略它,要学会灵活的使用,否则用户可能会以为发送了卡顿或者 ANR 从而关闭应用,大大减低用户体验。

2. ProgressBar 的属性

我们先来看看 ProgressBar 的常用属性:

android:max:

设置 ProgressBar 的最大值,即进度条走完时的总进度。通常和业务相关,比如下载 的时候,那么 max 就可以设置成下载文件的大小。默认是 100。

android:indeterminate:

设置是否开启不确定模式,该属性是一个 boolean 值。不确定模式就是我们在使用 Android 手机的时候,会有两种进度条的样式,一种是一直循环转圈的,还有一种是会跟随进度改变的。true 表示进度条会展示实际的进度;而 false 表示在加载时会无限循环展示 loading 动画。

android:minHeight:

设置最小高度。

android:minWidth:

设置最小宽度。

android:progress:

设置进度条的当前进度。

style:

设置进度条的样式,默认情况下,Android 系统会展示一个循环转圈的 loading 样式,而如果需要设置其他样式,就要用的 style 属性,比如通过设置style为android:attr/progressBarStyleHorizontal可以设置成横向进度条的样式。

android:progressDrawable:

设置进度条对应的 Drawable 对象的样式

android:secondaryProgress:

设置二级进度条的进度。看过视频或者听过音乐的应该都知道,我们会有两级进度条,一级是播放进度,二级是缓冲进度。

基本上常用的属性就这么多,都还比较好理解,这只是添加了一个进度条,如果我们是android:indeterminate模式,那只需要展示进度条和隐藏即可;但是如果android:indeterminate为 false,在实际使用中我们还需要在代码的逻辑里去实时更新进度条,这就需要配合 Java 的 api 来完成了。

3. ProgressBar 的常用 API

getMax():

返回进度条的最大值,即进度条的总进度,和android:max属性相通。

getProgress():

查询当前进度,和android:progress属性相通。

getSecondaryProgress():

查询当前的二级进度,和android:secondaryProgress属性相通。

incrementProgressBy(int diff):

设置当前增长的进度。

incrementSecondaryProgressBy(int diff):

设置当前二级进度增长的值。

isIndeterminate():

查询当前进度条是否在不确定模式下。

setIndeterminate(boolean indeterminate):

设置进度条是否启动不确定模式,和android:indeterminate属性相通。

以上常用 API 和属性基本都是挂钩的,所以我们可以根据业务场景动态的去更新进度条,从而实现进度的展示。

4. ProgressBar 编码

Ok,我们有了布局设置以及 API 控制,就可以开始完成一个进度条的开发了,本节将在 Activity 中启动一个子线程,在子线程中通过 sleep 300 毫秒来模拟一个耗时任务,并在执行任务的过程中不断更新进度条。

首先编写布局,我们添加一个横向非不确定进度条展示精确精度和一个圆形不确定进度条不展示确定进度,然后添加一个 TextView 用于展示具体的进度情况,代码如下:

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/progressBar_horizontal"

style="?android:attr/progressBarStyleHorizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="30dp"

android:indeterminate="false"

android:max="100"

android:minWidth="200dp"

android:minHeight="50dp"

android:progress="1" />

android:id="@+id/progressBar_circle"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:minWidth="50dp"

android:minHeight="50dp" />

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/progressBar_horizontal"

android:layout_alignLeft="@+id/progressBar_horizontal" />

布局完成效果如下,上方有一个进度为 1 的横向进度条,中间有一个循环转圈的圆形进度条。目前任务还没开启,所以还没有进度展示,TextView 内容为空。

下面通过 Java 编写后台耗时任务,并同步更新进度条:

package com.emercy.myapplication;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.widget.ProgressBar;

import android.widget.TextView;

public class MainActivity extends Activity {

private ProgressBar progressBar;

private int progressStatus = 0;

private TextView textView;

private Handler handler = new Handler();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

progressBar = findViewById(R.id.progressBar_horizontal);

textView = findViewById(R.id.textView);

new Thread(new Runnable() {

public void run() {

while (progressStatus < 100) {

progressStatus += 1;

handler.post(new Runnable() {

public void run() {

progressBar.setProgress(progressStatus);

textView.setText(progressStatus + "/" + progressBar.getMax());

}

});

try {

// sleep 300毫秒模拟耗时任务

Thread.sleep(300);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

}

}

在上面的代码中,横向 ProgressBar 会在每 300 毫秒更新一次进度(进度增加多少可以根据具体场景,比如下载量、保存量、解析量等等),更新进度通过setProgress()接口完成。另外本节运用了 Handler 去完成更新,因为耗时操作我们通常会放在子线程,但是 Android 系统要求不能在子线程中进行 UI 操作,所以我们通过 Handler 完成子线程到主线程的切换(具体的使用方法会在后面 Handler 章节详细讲解,这里重点关注 ProgressBar 的使用),直到进度条增加为 100,表示任务完成;而另一个进度条会循环 loading,此时会一直循环播放进度动画,直到主动关闭,下面是一张代码的效果图:

5. 小结

本节学习了进度条控件,介绍 PregressBar 的主要属性及常用 API,完成了一个耗时任务的进度实时更新程序。ProgressBar 主要针对需要执行耗时任务并且阻塞UI的场景,目的是给用户一个比较好的等待体验。

当然如果对 UI 要求很高,或者需要很复杂的 loading 动画的时候,ProgressBar 也许就不尽如人意了。这时候需要通过自定义 View 完全实现一个自己的进度条控件,这个大家在学习了自定义控件之后就可以轻松完成,关于自定义控件我们也会在后面的章节陆续学习到,敬请期待!

android编程任务进度条,Android 进度条 ProgressBar - Android 入门教程相关推荐

  1. Android Studio 3.4.1(3.5.2)入门教程( 2019.12.14修订)

    Android Studio 3.4.1入门教程 本文对自学者遇到的情况进行比较细致的讲解,解决初学者入门难,得不到成功体验,不能深入的问题.入了门,才能谈得上深入学习,特此写本文,供新手参考,以便新 ...

  2. Android编程小鸟游戏,6.【小萌伴Android】原生小游戏及其实现(二)小鸟

    前面介绍了<2048>的实现,现在来说说<防御小鸟>... [小萌伴]防御小鸟 从上图可以看出,<防御小鸟>有两种玩法,一种是利用管道将小鸟永久的挡在左边,另一种是 ...

  3. pdf百度云下载 python编程 从数据分析到数据科学_python零基础入门教程,不同方向的,这很重要...

    很多人都在学python,对于大多数的人来说,方向最重要的,它决定着你的结果! ​编程小十接触过很多想学python的人,相对于自己的学习目的来说,很多时候容易选择不太正确的方向. 下面我简单介绍一下 ...

  4. 《Android编程兵书》PDF版电子书下载

    点击下载: <Android编程兵书> 内容简介: 这是一本Android开发书籍,内容讲解详细,例子丰富,能帮助读者举一反三.在<Android编程兵书>中,每一个知识点的描 ...

  5. android解压zip文件进度条,Android实现文件解压带进度条功能

    解压的工具类 package com.example.videodemo.zip; public class ZipProgressUtil { /*** * 解压通用方法 * * @param zi ...

  6. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)

    都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...

  7. android canvas_Android仿IOS11 控制中心进度条

    这篇文章我们就用简单的自定义View实现类似iOS11的控制中心里边出现的很新颖的进度条. 先看一下目标效果图,以及最后的实现效果: 自定义属性分析 名字 释义 progressMax 最大值 pro ...

  8. 【Android 应用开发】 自定义 圆形进度条 组件

    转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...

  9. android 环形时间显示_Android圆形进度条颜色的设置

    最近几天由于项目的需要研究了一下listView的滑动数据动态的更新显示,其中需要在数据加载过程有圆形进度条的显示,遇到的问题是进度条的颜色设置,在网上查了一些资料结合自己的所得分享在此. xml布局 ...

最新文章

  1. Blog_mini完整部署文档
  2. 又一个jquery+flash上传插件
  3. 构造器Constructor是否可被override
  4. Detected call of `lr_scheduler.step()` before `optimizer.step()`.
  5. djpython教程_简单介绍Python的Django框架的dj-scaffold项目
  6. ARMLINUX学习笔记(5)-----ADS建立工程
  7. Faker 快速构造测试数据
  8. python基础1-字符串
  9. 计算机网络考研真题汇总
  10. 鸿蒙2.0系统刷机包,鸿蒙系统2.0刷机包
  11. 基于易智瑞(ArcGIS)JavaScript API的视频融合探索
  12. python从键盘上输入10个数、求其平均值_从键盘上循环输入10个数,求其平均值,并打印输出....
  13. 微信小程序授权微信开放平台
  14. 高颜值免费在线绘图BIC/ImageGP视频介绍
  15. 金蝶云苍穹笔记(三)
  16. (四十二)模态框的使用
  17. 部门换届推文文字_我院举行第二届学生代表大会暨学生会换届大会
  18. linux gpio喂狗驱动
  19. python阴阳鱼绘制(使用turtle)
  20. golang如何将http请求流转到gin

热门文章

  1. WORD 开新章节 自动从新的一页开始
  2. 计算机软件故障的排除方法,Windows 7系统常见小故障以及排除方法
  3. bzoj4808: 马(最小割)
  4. 逆水寒显示连接服务器失败,逆水寒脚本封号吗地下城fc提示连接服务器失败
  5. PLSQL中 commit 和 rollback 的区别
  6. 基于java+SSM+jsp框架的房屋租赁管理系统的设计和实现(附源码)
  7. Python使用LMDB(闪电内存映射数据库)
  8. 任正非:华为为什么要坚持工业科学管理
  9. cJSON库用法详解
  10. 项目篇 | 基于STM32单片机NBIOT定位实战项目