
6.2 进度条类组件
在Android中,提供了进度条、拖动条和星级评分条等进度条类组件。其中,用于显示某个耗时操作完成的百分比的组件称为进度条组件,用ProgressBar表示;允许用户通过拖曳滑块来改变值的组件称为拖曳条组件,用SeekBar表示;同样也是允许用户通过拖曳来改变进度,但是使用星星图案表示进度的组件称为星级评分条,用RatingBar表示。它们的继承关系如图6.5所示。
从图6.5可以看出,ProgressBar组件继承自View,而SeekBar和RatingBar组件又间接继承自ProgressBar组件。所以对于ProgressBar的属性,同样适用于SeekBar和RatingBar组件。下面将对这3个组件分别进行介绍。

图6.5 进度条类组件继承关系图
6.2.1 进度条
当一个应用在后台执行时,前台界面不会有任何信息,这时用户根本不知道程序是否在执行以及执行进度等,因此需要使用进度条来提示程序执行的进度。在Android中,提供了两种进度条:一种是水平进度条;另一种是圆形进度条。例如,开心消消乐的启动页面中的进度条为水平进度条;而一键清理大师的垃圾清理界面的进度条为圆形进度条。
在屏幕中添加进度条,可以在XML布局文件中通过<ProgressBar>标记添加,基本语法格式如下。

ProgressBar组件支持的XML属性如表6.1所示。
表6.1 ProgressBar支持的XML属性

除了表6.1介绍的属性外,进度条组件还提供了下面两个常用方法用于操作进度。
setProgress(int progress)方法:用于设置进度完成的百分比。
incrementProgressBy(int diff)方法:用于设置进度条的进度增加或减少。当参数值为正数时,表示进度增加;当参数值为负数时,表示进度减少。
下面编写一个关于在屏幕中使用进度条的实例。
【例6.03】 模拟开心消消乐启动界面(实例位置:资源包\源码\06\6.03)
在Android Studio中创建Module,名称为Horizontal Progress Bar。在该Module中实现本实例,具体步骤如下。
(1)修改新建Module的res/ayout目录下的布局文件activity_main.xml,将默认添加的布局管理器修改为相对布局管理器,并将TextView组件删除,然后添加一个水平进度条,并且将名称为xxll.jpg的背景图片复制到mipmap-mdpi目录中,修改后的代码如下。

说明
在上面的代码中,通过android:max属性设置水平进度条的最大进度值;通过style属性为ProgressBar指定风格。常用的style属性值如表6.2所示。
表6.2 ProgressBar的style属性的可选值

(2)打开主活动MainActivity,修改默认生成的代码,让MainActivity直接继承Activity,并导入android.app.Activity类,然后在onCreate()方法中添加设置当前Activity全屏的代码,修改后的具体代码如下。

(3)在主活动MainActivity中,定义一个ProgressBar类的对象(用于表示水平进度条)、一个int型的变量(用于表示完成进度)和一个处理消息的Handler类的对象,具体代码如下。

(4)在主活动的onCreate()方法中,首先获取水平进度条,然后通过匿名内部类实例化处理消息的Handler类(位于android.os包中)的对象,并重写handleMessage()方法,实现当耗时操作没有完成时更新进度,否则设置进度条不显示,关键代码如下。

说明
在上面的代码中,0x111为自定义的消息代码,通过它可以区分消息,以便进行不同的处理。
(5)开启一个线程,用于模拟一个耗时操作。在该线程中,调用sendMessage()方法发送处理消息,具体代码如下。

(6)运行本实例,将显示如图6.6所示的运行结果。

图6.6 模拟开心消消乐启动界面的水平进度条
6.2.2 拖动条
拖动条与进度条类似,所不同的是,拖动条允许用户拖动滑块来改变值,通常用于实现对某种数值的调节。例如,美图秀秀中的调整相片亮度的界面,以及在一键清理大师的设置界面中设置延迟时间和摇晃灵敏度的拖动条,都应用了拖动条。
在Android中,如果想在屏幕中添加拖动条,可以在XML布局文件中通过<SeekBar>标记添加,基本语法格式如下。

SeekBar组件允许用户改变拖动滑块的外观,这可以使用android:thumb属性实现,该属性的属性值为一个Drawable对象,该Drawable对象将作为自定义滑块。
由于拖动条可以被用户控制,所以需要为其添加OnSeekBarChangeListener监听器,基本代码如下。

说明
在上面的代码中,onProgressChanged()方法中的参数progress表示当前进度,也就是拖动条的值。
下面通过一个实例说明拖动条的应用。
【例6.04】 可以设置屏幕亮度的拖动条(实例位置:资源包\源码\06\6.04)
在Android Studio中创建Module,名称为SeekBar。在该Module中实现本实例,具体步骤如下。
(1)修改新建Module的res/ayout目录下的布局文件activity_main.xml。首先将默认添加的布局管理器修改为相对布局管理器,并将默认添加的TextView组件删除;然后添加一个拖动条,关键代码如下。

(2)创建BrightnessUtils类,该类为亮度工具类,首先在该类中创建getScreenBrightness()方法用于获取当前屏幕的亮度,代码如下。

(3)创建setSystemBrightness()方法,用于设置系统屏幕亮度,代码如下。

(4)创建saveBrightness()方法,用于保存亮度设置状态,代码如下。

(5)在主活动MainActivity中,声明一个SeekBar类的对象用于表示拖动条,再声明一个BrightnessUtils对象用于代表屏幕亮度工具类,代码如下。

(6)在onCreate()方法中判断当前系统的版本是否大于或等于6.0,符合条件将跳转开启系统设置权限的界面,代码如下。

(7)初始化工具类,然后获取拖动条控件,获取当前屏幕亮度并同步拖动条,最后设置拖动条的最大值,代码如下。

(8)设置拖动条滑动监听器,用于监听拖动条变化并与屏幕亮度同步,代码如下。

(9)在AndroidManifest.xml文件中添加修改系统设置的权限,代码如下。
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
(10)运行本实例,将显示如图6.7所示的运行结果。

图6.7 改变屏幕亮度的拖动条
注意
使用拖动条设置屏幕亮度前,需要将手机自动调节屏幕亮度的功能关闭。
6.2.3 星级评分条
星级评分条与拖动条类似,都允许用户通过拖动的方式来改变进度,所不同的是,星级评分条是通过五角星图案来表示进度的。通常情况下,使用星级评分条表示对某一事物的支持度或对某种服务的满意程度等。例如,淘宝中对卖家的好评度就是通过星级评分条实现的,百度外卖的添加评论界面也应用了星级评分条。
在Android中,如果想在屏幕中添加星级评分条,可以在XML布局文件中通过<RatingBar>标记添加,基本语法格式如下。

RatingBar组件支持的XML属性如表6.3所示。
表6.3 RatingBar组件支持的XML属性

除了表6.3介绍的属性外,星级评分条还提供了以下3个比较常用的方法。
getRating()方法:用于获取等级,表示选中了几颗星。
getStepSize()方法:用于获取每次最少要改变多少个星级。
getProgress()方法:用于获取进度,获取到的进度值为getRating()方法返回值与getStepSize()方法返回值之商。
下面通过一个具体的实例来说明星级评分条的应用。
【例6.05】 模拟淘宝评价界面(实例位置:资源包\源码\06\6.05)
在Android Studio中创建Module,名称为Star Rating。实现本实例的具体步骤如下。
(1)修改新建Module的res/ayout目录下的布局文件activity_main.xml,首先将默认添加的布局管理器修改为相对布局管理器,然后添加一个星级评分条和一个普通按钮,并将背景图片复制到mipmap-mdpi文件夹中,修改后的代码如下。

(2)打开主活动MainActivity,修改默认生成的代码,让MainActivity直接继承Activity,并导入android.app.Activity类,然后定义一个RatingBar类的对象,用于表示星级评分条,修改后的具体代码如下。

(3)在主活动的onCreate()方法中,首先获取布局文件中添加的星级评分条,然后获取提交按钮,并为其添加单击事件监听器,在重写的onClick()事件中,实现获取进度、等级和每次最少要改变多少个星级并显示到日志中,同时通过消息提示框显示获得的星的个数,关键代码如下。

(4)运行本实例,将显示如图6.8所示的运行结果。

图6.8 单击“发表评价”按钮显示选择了几颗星