【android_温故知新】第 5 组 UI 组件:ProgressBar 及其子类

来源:互联网 发布:期货仓位 知乎 编辑:程序博客网 时间:2024/05/18 06:53

  • 进度条 ProgressBar 的功能与用法
    • ProgressBar 支持的常用 XML 属性
    • 实例显示在标题上的进度条
    • 温馨提示
  • 拖动条 SeekBar 的功能与用法
    • 温馨提示
    • 实例通过拖动滑块来改变图片的透明度
  • 星级评分条 RatingBar 的功能与用法
    • RatingBar 支持的常见 XML 属性
    • 实例通过星级改变图片的透明度

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

Android 支持多种风格进度条,通过 style 属性可以为 ProgressBar 指定风格。该属性可支持如下几个属性值。

1. @android : style/Widget.ProgressBar.Horizontal : 水平进度条。
2. @android : style/Widget.ProgressBar.Inverse : 普通大小的环形进度条。
3. @android : style/Widget.ProgressBar.Large : 大环形进度条。
4. @android : style/Widget.ProgressBar.Large.Inverse : 大环形进度条。
5. @android : style/Widget.ProgressBar.Small : 小环形进度条。
6. @android : style/Widget.ProgressBar.Small.Inverse : 小环形进度条。

ProgressBar 支持的常用 XML 属性

XML 属性 说 明 android:max 设置该进度条的最大值 android:progress 设置该进度条的已完成进度条 android:progressDrawable 设置该进度条的轨道对应的 Drawable 对象 android:indeterminate 该属性设置为 true,设置进度条不精确显示进度 android:indeterminateDrawable 设置绘制不显示进度条的 Drawable 对象 android:indeterminateDuration 设置不精确显示进度的持续时间

android:progressDrawable 用于指定进度条的轨道的绘制形式,该属性可指定为一个 LayerDrawable 对象(该对象可通过 XML 文件中用< layer-list >元素进行配置)的引用。

ProgressBar 提供了如下方法来操作进度。

1. setProgress(int) : 设置进度的完成百分比。
2. incrementProgressBy(int) : 设置进度条的进度增加或减少。当参数为正数时进度增加;当参数为负数时进度减少。

下面的程序简单地示范了进度条的用法。该程序的界面布局文件只是定义了几个简单地进度条,并指定了 style 属性为@android:style/Widget.ProgressBar.Horizontal,即水平进度条。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <LinearLayout        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <!-- 定义一个大环形进度条 -->        <ProgressBar            android:layout_width="wrap_content"            android:layout_height="wrap_content"            style="@android:style/Widget.ProgressBar.Large"/>        <!-- 定义一个中等大小的环形进度条 -->        <ProgressBar            android:layout_width="wrap_content"            android:layout_height="wrap_content"/>        <!-- 定义一个小环形进度条 -->        <ProgressBar            android:layout_width="wrap_content"            android:layout_height="wrap_content"            style="@android:style/Widget.ProgressBar.Small"/>    </LinearLayout>    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="任务完成的进度"/>    <!-- 定义一个水平进度条 -->    <ProgressBar        android:id="@+id/bar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:max="100"        style="@android:style/Widget.ProgressBar.Horizontal"/>    <!-- 定义一个水平进度条,并改变轨道外观 -->    <ProgressBar        android:id="@+id/bar2"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:max="100"        android:progressDrawable="@drawable/my_bar"        style="@android:style/Widget.ProgressBar.Horizontal"/></LinearLayout>
<?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>
public class MainActivity extends Activity {    // 该程序模拟填充长度为100的数组    private int[] data = new int[100];    int hasData = 0;    // 记录ProgressBar的完成进度    int status = 0;    ProgressBar bar, bar2;    // 创建一个负责更新的进度的Handler    Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            // 表明消息是由该程序发送的            if (msg.what == 0x111) {                bar.setProgress(status);                bar2.setProgress(status);            }        }    };    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        bar = (ProgressBar) findViewById(R.id.bar);        bar2 = (ProgressBar) findViewById(R.id.bar2);        // 启动线程来执行任务        new Thread() {            public void run() {                while (status < 100) {                    // 获取耗时操作的完成百分比                    status = doWork();                    // 发送消息                    mHandler.sendEmptyMessage(0x111);                }            }        }.start();    }    // 模拟一个耗时的操作    public int doWork() {        // 为数组元素赋值        data[hasData++] = (int) (Math.random() * 100);        try {            Thread.sleep(100);        } catch (InterruptedException e) {            e.printStackTrace();        }        return hasData;    }}

实例:显示在标题上的进度条

此类进度条可以直接在窗口标题上显示,这种进度条甚至不需要使用 ProgressBar 组件,它是直接由 Activity 的方法启用的。为了在窗口标题上显示进度条,需要经过如下两步。

1. 调用 Activity 的 requestWindowFeature()方法,该方法根据传入的参数可启用特定的窗口特征。例如,传入 Window.FEATURE_INDETERMINATE_PROGRESS 在窗口标题上显示不带进度的进度条、传入Window.FEATURE_PROGRESS 则显示带进度的进度条。
2. 调用 Activity 的 setProgressBarVisibility(boolean) 或 setProgressBarIndeterminateVisibility(boolean)方法即可控制进度条的显示和隐藏。

public class MainActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //设置窗口特征:启用显示进度的进度条        requestWindowFeature(Window.FEATURE_PROGRESS);  //①        //设置窗口特征:启用不显示进度的进度条//      requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); //②        setContentView(R.layout.main);        Button bn1 = (Button) findViewById(R.id.bn1);        Button bn2 = (Button) findViewById(R.id.bn2);        bn1.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View source) {                //显示不带进度的进度条                setProgressBarIndeterminateVisibility(true);                //显示带进度的进度条                setProgressBarVisibility(true);                //设置进度条的进度                setProgress(4500);            }        });        bn2.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View source) {                //隐藏不带进度的进度条                setProgressBarIndeterminateVisibility(false);                //隐藏带进度的进度条                setProgressBarVisibility(false);            }        });    }}

上面程序中的①号代码控制窗口标题上显示带进度的进度条,而②号代码则控制窗口标题上显示不带进度的进度条。程序中两个按钮主要用于控制进度条的显示、隐藏。

温馨提示

Android 5.0 默认的主题:Material(Android 5.0 的重要更新之一就是采用了 Material Design),而这个默认主题将看不到标题上的进度条。因此,本实例在 AndroidManifest.xml 文件中将该应用的主题设为 Holo。

拖动条( SeekBar )的功能与用法

拖动条和进度条非常相似,只是进度条采用颜色填充来表明进度完成的程度,而拖动条则通过滑块的位置来表示数值 —- 而且拖动条允许用户拖动滑块来改变值,因此拖动条通常用于对系统的某种数值进行调节,比如调节音量等。

温馨提示

由于拖动条 SeekBar 继承了 ProgressBar,因此 ProgressBar 所支持的 XML 属性和方法完全适用于 SeekBar。

SeekBar 允许用户改变拖动条的滑块外观,改变滑块外观通过如下属性指定。
1.android:thumb : 指定一个 Drawable 对象,该对象将作为自定义滑块。

实例:通过拖动滑块来改变图片的透明度

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ImageView        android:id="@+id/image"        android:layout_width="match_parent"        android:layout_height="240dp"        android:src="@drawable/lijiang"/>    <!-- 定义一个拖动条,并改变它的滑块外观 -->    <SeekBar        android:id="@+id/seekbar"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:max="255"        android:progress="255"        android:thumb="@drawable/ic_launcher"/></LinearLayout>
public class MainActivity extends Activity {    ImageView image;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        image = (ImageView) findViewById(R.id.image);        SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {            // 当拖动条的滑块位置发生改变时触发该方法            @Override            public void onProgressChanged(SeekBar arg0, int progress,                                          boolean fromUser) {                // 动态改变图片的透明度                image.setImageAlpha(progress);            }            @Override            public void onStartTrackingTouch(SeekBar bar) {            }            @Override            public void onStopTrackingTouch(SeekBar bar) {            }        });    }}

星级评分条( RatingBar )的功能与用法

星级评分条与拖动条有相同的弗雷:AbsSeekBar,因此它们十分相似。实际上星级评分条与拖动条的用法、功能都十分接近:它们都允许用户通过拖动来改变进度。RatingBar 与 SeekBar 的最大区别在于:RatingBar 通过星星来表示进度。

RatingBar 支持的常见 XML 属性

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:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">    <ImageView        android:id="@+id/image"        android:layout_width="match_parent"        android:layout_height="240dp"        android:src="@drawable/lijiang"/>    <!-- 定义一个星级评分条 -->    <RatingBar        android:id="@+id/rating"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:numStars="5"        android:max="255"        android:progress="255"        android:stepSize="0.5"/></LinearLayout>
public class MainActivity extends Activity {    ImageView image;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        image = (ImageView) findViewById(R.id.image);        RatingBar ratingBar = (RatingBar) findViewById(R.id.rating);        ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {            // 当星级评分条的评分发生改变时触发该方法            @Override            public void onRatingChanged(RatingBar arg0, float rating,                                        boolean fromUser) {                // 动态改变图片的透明度,其中255是星级评分条的最大值                // 5个星星就代表最大值255                image.setImageAlpha((int) (rating * 255 / 5));            }        });    }}
1 0
原创粉丝点击