非常普遍的ProgressBar进度条
不知不觉这已经是第51期了,在前面50期我们学了Android开发中使用频率非常高的一些UI组件,当然这些组件还不足够完成所有APP的开发,还会经常用到一些诸如进度条、拖动条、搜索框、时间和日期选择器等组件,那么后面几期就来一起学习这些高级组件。
一、ProgressBar系列组件
ProgressBar也是一组重要的组件,ProgressBar本身代表了进度条组件,它还派生了两个常用的组件:SeekBar和RatingBar。ProgressBar及其子类在用法上十分相似,只是显示界面有一定的区别,因此本节把它们归为一类,针对它们的共性集中讲解,并突出介绍它们的区别。
ProgressBar及其子类的类图如下图所示:
ProgressBar继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar, 其中AbsSeekBar的子类有SeekBar和RatingBar,可见这二者是基于ProgressBar实现的。
二、ProgressBar基础
进度条也是UI界面中一种非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比。
进度条可以动态地显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应,从而更好地提高用户界面的友好性。
Android支持多种风格的进度条,通过style属性可以为ProgressBar指定风格。该属性可支持如下几个属性值:
- @android:style/Widget.ProgressBar.Horizontal:水平进度条。
- @android:style/Widget.ProgressBar.Inverse:普通大小的环形进度条。
- @android:style/Widget.ProgressBar.Large:大环形进度条。
- @android:style/Widget.ProgressBar.Large.Inverse:大环形进度条。
- @android:style/Widget.ProgressBar.Small:小环形进度条。
- @android:style/Widget.ProgressBar.Small.Inverse:小环形进度条。
其实在Android开发中,ProgressBar的样式设定有两种方式,除了上面这种,还有一种可以通过如下方式使用:
- ?android:attr/progressBarStyle
- ?android:attr/progressBarStyleHorizontal
- ?android:attr/progressBarStyleInverse
- ?android:attr/progressBarStyleLarge
- ?android:attr/progressBarStyleLargeInverse
- ?android:attr/progressBarStyleSmall
- ?android:attr/progressBarStyleSmallInverse
- ?android:attr/progressBarStyleSmallTitle
除此之外,ProgressBar还支持如下常用XML属性:
- android:max:进度条的最大值。
- android:progress:进度条已完成进度值。
- android:progressDrawable:设置轨道对应的Drawable对象。
- android:indeterminate:如果设置成true,则进度条不精确显示进度。
- android:indeterminateDrawable:设置不显示进度的进度条的Drawable对象。
- android:indeterminateDuration:设置不精确显示进度的持续时间。
- android:secondaryProgress:二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度。
其中android:progressDrawable用于指定进度条的轨道的绘制形式,该属性可指 定为一个LayerDrawable对象的引用。
ProgressBar提供了如下方法来操作进度:
- getMax():返回这个进度条的范围的上限。
- getProgress():返回进度。
- getSecondaryProgress():返回次要进度。
- incrementProgressBy(int diff):指定增加的进度。为正数时进度增加;为负数时进度减少。
- isIndeterminate():指示进度条是否在不确定模式下。
- setIndeterminate(boolean indeterminate):设置是否为不确定模式。
三、ProgressBar示例
接下来通过一个简单的示例程序来学习系统默认ProgressBar的使用。
从本期开始的高级UI组件部分使用新的模块来完成,可以参照初识ListView这期的创建方法,新建一个advancedviewsample模块。
这个示例用户界面非常简单,新建程序对应的布局文件activity_main.xml的代码如所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- 系统提供的圆形进度条,依次是大中小 -->
<ProgressBar
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
style="@android:style/Widget.ProgressBar.Large"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!--系统提供的水平进度条-->
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="18" />
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:indeterminate="true" />
</LinearLayout>
上面的界面布局文件中先定义了三个环形进度条,这种环形进度条无法显示进度,它只是显示一个不断旋转的图片。
布局文件的后面定义的两个水平进度条,第一个进度条有设置进度值;第二个进度条不精确显示进度。
程序其余地方不用修改,直接运行程序可以看到下图所示界面效果。
从上图发现,这些进度条都不是很美观,而且也没法显示具体进度值,这就需要开发者自定义ProgressBar了,我们下期再来一同学习。
- oracle多用户并发及事务处理
- 数据中心整合会导致更高的云价格吗?
- Linux下oracle开机自启动服务
- KMP算法初探
- oracle数据库性能
- oracle数据结构
- Ubuntu13.04配置:Vim+Syntastic+Vundle+YouCompleteMe
- Python 3.x自定义迭代器对象
- 检测OpenWhisk Web Actions
- Linux平台Qt creator报错:Circular all <- first dependency dropped
- 循环队列
- Qt界面编程:窗口传值方式
- 在任何地方部署Kubernetes
- 记录:编译Qt5.0连接MySql5.5数据库的驱动
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 离线安装PySCF程序(1.5及更高版本)
- Python Debug(调试)的终极指南
- Linux下做计算常用的别名alias推荐
- 离线安装支持Intel MKL的R-3.6
- Dalton使用——磷光及其相关过程
- 【赵渝强老师】Flink的Watermark机制(基于Flink 1.11.0实现)
- 在Windows CMD里“使用”常见Linux命令
- 什么是Python中的Dask,它如何帮助你进行数据分析?
- a[i] = i++ 到底对不对?
- 如何监视Python程序的内存使用情况
- df -h和du -sh看到的硬盘使用不相等?
- MyBatis 中的一级和二级缓存
- 使用Cython加速你的Python代码
- 使用Python从PDF文件中提取数据
- 用Docker快速实现SAPT能量分解分析