二、Android应用的界面编程(六)ProgressBar及其子类[SeekBar、RatingBar]er

通常用于向用户显示某个耗时操作完成的百分比。
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常用的XML属性和方法】
android:max 设置该进度条的最大值
android:progress 设置该进度条的已完成进度值
android:progressDrawable 设置该进度条的轨道对应的Drawable对象
android:indeterminate 该属性设为true,设置进度条不精确显示进度
android:indeterminateDrawable 设置绘制不显示进度的进度条的Drawable对象
android:indeterminateDuration 设置不精确显示进度的持续时间

getMax():返回这个进度条的范围的上限。
getProgress():返回进度。
getSecondaryProgress():返回次要进度。
incrementProgressBy(int diff):指定增加的进度或减少(+进度增加,-进度减少)。
isIndeterminate():指示进度条是否在不确定模式下。
setIndeterminate(boolean indeterminate):设置不确定模式下。
setVisibility(int v):设置该进度条是否可视。

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

范例:进度条各种样式。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 7     <LinearLayout
 8         android:layout_width="match_parent"
 9         android:layout_height="wrap_content"
10         android:orientation="horizontal" >
12         <!-- 定义一个大环形进度条 -->
13         <ProgressBar
14             style="@android:style/Widget.ProgressBar.Large"
15             android:layout_width="wrap_content"
16             android:layout_height="wrap_content" />
18         <!-- 定义一个中等大小的环形进度条 -->
19         <ProgressBar
20             android:layout_width="wrap_content"
21             android:layout_height="wrap_content" />
23         <!-- 定义一个小环形进度条 -->
24         <ProgressBar
25             style="@android:style/Widget.ProgressBar.Small"
26             android:layout_width="wrap_content"
27             android:layout_height="wrap_content" />
28     </LinearLayout>
29
30     <TextView
31         android:layout_width="fill_parent"
32         android:layout_height="wrap_content"
33         android:text="任务完成的进度" />
34
35     <!-- 定义一个水平进度条 -->
36     <ProgressBar
37         android:id="@+id/bar"
38         style="@android:style/Widget.ProgressBar.Horizontal"
39         android:layout_width="fill_parent"
40         android:layout_height="wrap_content"
41         android:max="100" />
43     <!-- 定义一个水平进度条,并改变轨道外观 -->
44     <ProgressBar
45         android:id="@+id/bar2"
46         style="@android:style/Widget.ProgressBar.Horizontal"
47         android:layout_width="fill_parent"
48         android:layout_height="wrap_content"
49         android:max="100"
50         android:progressDrawable="@drawable/my_bar" />
52 </LinearLayout>

其中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>
 1 public class ProgressBarTest extends Activity {
 2     // 该程序模拟填充长度为100的数组
 3     private int[] data = new int[100];
 4     int hasData = 0;
 5     // 记录ProgressBar的完成进度
 6     int status = 0;
 7     ProgressBar bar, bar2;
 8     // 创建一个负责更新的进度的Handler
 9     Handler mHandler = new Handler() {
10         @Override
11         public void handleMessage(Message msg) {
12             // 表明消息是由该程序发送的
13             if (msg.what == 0x111) {
14                 bar.setProgress(status);
15                 bar2.setProgress(status);
16             }
17         }
18     };
19
20     @Override
21     public void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.main);
24         bar = (ProgressBar) findViewById(R.id.bar);
25         bar2 = (ProgressBar) findViewById(R.id.bar2);
26
27         // 启动线程来执行任务
28         new Thread() {
29             public void run() {
30                 while (status < 100) {
31                     // 获取耗时操作的完成百分比
32                     status = doWork();
33                     // 发送消息
34                     mHandler.sendEmptyMessage(0x111);
35                 }
36             }
37         }.start();
38     }
39
40     // 模拟一个耗时的操作
41     public int doWork() {
42         // 为数组元素赋值
43         data[hasData++] = (int) (Math.random() * 100);
44         try {
45             Thread.sleep(100);
46         } catch (InterruptedException e) {
47             e.printStackTrace();
48         }
49         return hasData;
50     }
51 }

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

public class TitleProgressBar 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);
            }
        });
    }
}

===== 拖动条(SeekBar)的功能和用法 =====
# 拖动条是通过滑块的位置来标识数值,而且拖动条允许用户拖动滑块来改变值,比如:调节音量等。
# 由于SeekBar继承了ProgressBar,因此ProgressBar所支持的XML属性和方法完全适用于SeekBar。
# android:thumb:指定一个Drawable对象,该对象将作为自定义滑块,改变拖动条的滑块外观。
# 为了让程序能响应拖动条滑块位置的改变,程序可以考虑为它绑定一个OnSeekBarChangeListener监听器。

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

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent">
 6 <ImageView
 7     android:id="@+id/image"
 8     android:layout_width="fill_parent"
 9     android:layout_height="240px"
10     android:src="@drawable/lijiang" />
11 <!-- 定义一个拖动条,并改变它的滑块外观 -->
12 <SeekBar
13     android:id="@+id/seekbar"
14     android:layout_width="fill_parent"
15     android:layout_height="wrap_content"
16     android:max="255"
17     android:progress="255"
18     android:thumb="@drawable/ic_launcher" />
19 </LinearLayout>
 1 public class SeekBarTest extends Activity {
 2     ImageView image;
 3
 4     @Override
 5     public void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.main);
 8         image = (ImageView) findViewById(R.id.image);
 9         SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);
10
11         seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
12             // 当拖动条的滑块位置发生改变时触发该方法
13             @Override
14             public void onProgressChanged(SeekBar arg0, int progress,
15                     boolean fromUser) {
16                 // 动态改变图片的透明度
17                 image.setAlpha(progress);
18             }
20             @Override
21             public void onStartTrackingTouch(SeekBar bar) {
22             }
24             @Override
25             public void onStopTrackingTouch(SeekBar bar) {
26             }
27         });
28     }
29 }

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

# RatingBar与SeekBar最大区别在于:RatingBar通过星星来表示进度。

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

为了让程序能相应星级评分的改变,程序可以考虑为它绑定一个OnRatingBarChangeListener监听器。

范例:通过星级改变图片的透明度

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent">
 6 <ImageView
 7     android:id="@+id/image"
 8     android:layout_width="fill_parent"
 9     android:layout_height="240px"
10     android:src="@drawable/lijiang" />
11 <!-- 定义一个星级评分条 -->
12 <RatingBar
13     android:id="@+id/rating"
14     android:layout_width="wrap_content"
15     android:layout_height="wrap_content"
16     android:numStars="5"
17     android:max="255"
18     android:progress="255"
19     android:stepSize="0.5" />
20 </LinearLayout>
 1 public class RatingBarTest extends Activity {
 2     ImageView image;
 3
 4     @Override
 5     public void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.main);
 8         image = (ImageView) findViewById(R.id.image);
 9         RatingBar ratingBar = (RatingBar) findViewById(R.id.rating);
10
11         ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
12             // 当拖动条的滑块位置发生改变时触发该方法
13             @Override
14             public void onRatingChanged(RatingBar arg0, float rating,
15                     boolean fromUser) {
16                 // 动态改变图片的透明度,其中255是星级评分条的最大值
17                 // 5个星星就代表最大值255
18                 image.setAlpha((int) (rating * 255 / 5));
19             }
20         });
21     }
22 }

由于上面定义RatingBar时指定了android:stepSize="0.5",因此该星级评分条中星级的最小变化为0.5,也就是

最少要变化半个星级。

【改变样式】其中XML属性 style="@style/roomRatingBar"的样式如下:

styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="roomRatingBar" parent="@android:style/Widget.RatingBar">
       <item name="android:progressDrawable">@drawable/room_rating_bar</item>
       <item name="android:minHeight">16dip</item>
       <item name="android:maxHeight">16dip</item>
    </style>
</resources>

上面的意思是继承@android:style/Widget.RatingBar,重写android:progressDrawable属性,换成我们自定义@drawable/room_rating_bar文件。

控制该组件的最大和最小高度。好我们继续去找这自定义文件@drawable/room_rating_bar。

room_rating_bar.xml

<?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/room_unselect" />
    <item android:id="@+android:id/secondaryProgress"
    android:drawable="@drawable/room_unselect" />
    <item android:id="@+android:id/progress"
    android:drawable="@drawable/room_select" />
</layer-list>
时间: 2024-10-11 00:50:01

二、Android应用的界面编程(六)ProgressBar及其子类[SeekBar、RatingBar]er的相关文章

二、Android应用的界面编程(七)ViewAnimator及其子类[ ViewSwitcher、ImageSwitcher、TextSwitcher、ViewFlipper ]

ViewAnimator是一个基类,它继承了FrameLayout.因此它表现出FrameLayout的特征,可以将多个View组“叠”在一起. ViewAnimator可以在View切换时表现出动画效果. ViewAnimator及其子类也是一组非常重要的UI组件,这种组件的主要功能是增加动画效果.从而使界面更加“炫”. [ViewAnimator及其子类的继承关系] 图2.56 [ViewAnimator支持的常见XML属性]android:animateFirstView 设置ViewAn

Android开发自学笔记(Android Studio)&mdash;4.界面编程与View组件简单介绍

一.引言 Android应用开发最重要的一份内容就是界面的开发,无论你程序包含的内容多么优秀,如若没有一个良好的用户交互界面,最终也只是会被用户所遗弃.Android SDK提供了大量功能丰富的UI组件,开发者只需要拖拖拽拽就能完成简单的应用,这些只是界面的展示,如果要完成优秀的用户交互,事件响应机制当然也是重点,这是后话. Android SDK中绝大部分UI组件都在androd.widget及其子包.android.view及其子包下,Android应用中的所有UI组件都继承了View类,V

二、Android应用的界面编程(一)界面编程与视图(View)组件

Android应用的绝大部分UI组件都放在android.widget包及其子包.android.view包及其子包中,Android应用的所有UI组件都继承了View类.它代表一个空白的矩形区域.View类还有一个重要的子类:ViewGroup,但ViewGroup通常作为其他组件的容器使用.Android的所有UI都是建立在View.ViewGroup基础之上的,因此ViewGroup也可以被当成View使用.ViewGroup里除了可以包含普通View组件之外,还可以再次包含ViewGro

Android应用的界面编程(二)

第一组UI组件--以viewGroup为基类的布局管理器 Android的布局管理器本身就是一个UI组件,继承了View类,是ViewGroup的一个子类. 从图可以看出来,所有布局都可以作为容器类使用,因此可以调用多个重载的方法addView()向布局容器添加组件. 1.线性布局 线性布局即LinearLayout,能将容器的组件一个挨着一个排列起来,可以控制横向排列还是纵向排列.当然,线性布局不会换行,当组件一个挨着一个排列到头之后,剩下的组件不会被显示出来. 1.1LinearLayout

Android学习笔记(一)——Android应用的界面编程

Android提供了大量丰富的UI组件,所有的UI组件都继承自View类,View组件非常类似于Swing编程的JPanel,它代表一个空白的矩形区域. Android采用"组合器"设计模式来设计View和ViewGroup:ViewGroup是View的子类,因此ViewGroup也可以当成View使用. Android推荐使用XML布局文件来定义用户界面,而不是使用Java代码来开发用户界面.使用XML布局文件来控制视图,不仅简单.明了,而且可以将应用中的逻辑视图从Java代码中分

[转]android学习----基础UI编程(六)

相簿浏览 Gallery 文件搜索引擎FileSearch 17. Gallery 与 衍生BaseAdapter 容器 Gallery控件,即Android的图片库控件. 需要定义一个BaseAdaper的子类(eg.ImageAdapter)来操作控制图片资源,然后在主类中通过Gallery.setAdapter(new ImageAdapter(this));来使用这个控制类. 示例代码 本例中 ImageView 和 Gallery 控件相互协作 . ① 新建项目 ② 定义layout

Android 界面编程 探险(二)

本篇将开始Android 界面编程探险(二)的旅程. 1.UI组件-AdapterView及其子类(二) 1)自动完成文本框(AutoCompleteTextView)的用法 MultiAutoCompleteTextView是AutoCompleteTextView派生的子类,MultiAutoCompleteTextView允许输入多个提示项,多个提示项以分隔符分隔.下面简单演示AutoCompleteTextView和MultiAutoCompleteTextView的用法: main.x

Android界面编程——导航栏及菜单(六)

Android界面编程--导航栏及菜单 2.7导航栏及菜单 2.7.1  ActionBar ActionBar是Android3.0(API 11)开始增加的新特性,ActionBar出现在活动窗口的顶部,可以显示标题.icon.Actions按钮.可交互View,可实现应用程序级的导航,如图2.7-1所示 图2.7-1 其中 1. App icon: 主要用于展示App的Logo,如果当前界面不是一级界面,还可以展示返回航. 2.View Control: 用于切换不同的视图或者展示非交互信

Android界面编程——Android布局组件(二)

Android界面编程 2.3.1 布局介绍 布局用于定义Activity中UI元素的排列结构,Android提供了LinearLayout线性布局.RelativeLayout相对布局 .FrameLayout帧布局 .TableLayout表格布局.AbsoluteLayout坐标布局 共五种布局,可以通过两种方式声明布局: ? 在 XML 中声明 UI 元素.Android 提供了对应于 View 类及其子类的XML 元素 ? 运行时实例化布局元素.可以通过编程创建 View 对象和 Vi