UI组件:进度条ProgressBar及其子类

来源:互联网 发布:全世界网络设墙的国家 编辑:程序博客网 时间:2024/06/05 10:37

ProgressBar本身代表了进度条组件,它还派生出了两个常用组件:SeekBar和RatingBar。

进度条(ProgressBar)的功能和用法

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 : 小环形进度条

ProgressBar提供了如下方法来操作进度条:
setProgress(int) : 设置进度条的完成百分比
incrementProgressBy(int) : 设置进度条的进度增加或减少。当参数为正数时进度条增加,为负数时,进度条减小。
下面定义了几个简单的进度条,布局文件代码如下所示:

<?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:layout_marginTop="10dp"    android:orientation="vertical">    <!--水平进度条-->    <ProgressBar        android:layout_width="match_parent"        android:layout_height="wrap_content"        style="@android:style/Widget.ProgressBar.Horizontal"/>    <!--水平进度条,并改变轨道外观-->    <ProgressBar        android:layout_width="match_parent"        android:layout_height="wrap_content"        style="@android:style/Widget.ProgressBar.Horizontal"        android:progressDrawable="@drawable/my_bar"/>    <!--普通大小的环形进度条-->    <ProgressBar        android:layout_width="match_parent"        android:layout_height="wrap_content"        style="@android:style/Widget.ProgressBar.Inverse"/>    <!--大环形进度条-->    <ProgressBar        android:layout_width="match_parent"        android:layout_height="wrap_content"        style="@android:style/Widget.ProgressBar.Large.Inverse"/>    <!--小环形进度条-->    <ProgressBar        android:layout_width="match_parent"        android:layout_height="wrap_content"        style="@android:style/Widget.ProgressBar.Small.Inverse"/></LinearLayout>

android:progressDrawable属性用于指定进度条的轨道绘制形式,该属性可以指定为一个LayerDrawable对象。
上面代码中android:progressDrawable的属性值@drawable/my_bar对应的代码如下所示 :

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <!--定义轨道的背景-->    <item android:id="@android:id/background"        android:drawable="@drawable/no"/>    <!--定义轨道已完成的状态-->    <item android:id="@android:id/progress"        android:drawable="@drawable/ok"/></layer-list>

下面的程序用一个填充数组的任务模拟耗时任务,并以进度条来标识任务的完成百分比,主程序代码如下:

package com.example.administrator.progressbarinfo;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.widget.ProgressBar;public class MainActivity extends AppCompatActivity {    //改程序模拟填充长度为100的数组    private int[] data = new int[100];    private int hasData = 0;    //记录进度条的完成进度    private int status = 0;    private ProgressBar bar1,bar2;    //创建一个负责更新进度的Handler    private Handler mHandler = new Handler(){        @Override        public void handleMessage(Message msg) {            if (msg.what==0x111){                bar1.setProgress(status);                bar2.setProgress(status);            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bar1 = (ProgressBar) findViewById(R.id.bar1);        bar2 = (ProgressBar) findViewById(R.id.bar2);        //启动线程来执行任务        new Thread(){            @Override            public void run() {                while(status<100){                    //获取耗时操作的完成百分比                    status = doWork();                    //发送消息                    mHandler.sendEmptyMessage(0x111);                }            }        }.start();    }    /**     * 模拟一个耗时操作     * @return     */    private int doWork() {        //为数组元素赋值        data[hasData++] = (int)(Math.random()*100);        try {            Thread.sleep(100);        } catch (InterruptedException e) {            e.printStackTrace();        }        return hasData;    }}

程序效果如下所示:

拖动条(SeekBar)

SeekBar允许用户改变拖动条的滑块外观,改变滑块外观通过如下属性来指定。

android:thumb : 指定了一个Drawable对象,该对象将作为自定义滑块。

为了响应拖动条滑块位置的改变,可为拖动条绑定一个OnSeekBarChangeListenter监听器。

星级评分条(RatingBar)

XML属性 说明 android:isIndicator 设置该星级评分条是否允许用户改变(true为不允许改变) android:numStars 设置该星级评分条总共有多少星级 android:rating 设置该星级评分条默认的星级 android:stepSize 设置每次最少需要改变多少个星级

下面的实例通过星级评分条改变图片的透明度。
布局文件代码如下所示:

<?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">    <RatingBar        android:id="@+id/rating_bar"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:numStars="5"        android:rating="5"        android:max="1"        android:progress="1"        android:stepSize="0.5"/>    <ImageView        android:id="@+id/image"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:src="@drawable/lijiang"/></LinearLayout>

主程序代码如下:

public class RatingBarActivity extends AppCompatActivity {    private ImageView imageView;    private RatingBar ratingBar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_rating_bar);        imageView = (ImageView) findViewById(R.id.image);        ratingBar = (RatingBar) findViewById(R.id.rating_bar);        ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {            //当星级评分条的位置发生改变时触发该方法            @Override            public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {                //改变图片的透明度                //每个星星的最大值为1,5个星星的最大值为5,星级评分条的最小变化为0.5,也就是每次改变半颗星星                imageView.setAlpha(rating/5);            }        });    }}

效果如下所示:

0 0
原创粉丝点击