`
tnje_2007
  • 浏览: 4498 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

【转】Android UI--ProgressBar

阅读更多

转载自:http://www.cnblogs.com/plokmju/p/android_ProgressBar.html

前言

  开门见山,开篇明意。这篇博客主要讲解一下Android中ProgressBar控件以及间接继承它的两个子控件SeekBar、RatingBar的基本用法,因为其有继承关系,存在一些共有特性,所以在一篇博客中讲解。下面先简单描述一下这三个控件:

  • ProgressBar是一个进度条控件,一般在需要做某个比较耗时的操作的时候,向用户展示执行进度,以免用户以为已经失去响应。
  • SeekBar是一个拖动条控件,拖动条通过滑块表示数值,而用户可以在一定范围内拖动这个滑块而改变其数值。
  • RatingBar是一个星级评分控件,向用户展示一个评分样式的控件,用户可以选择星级来为其评分。

 

ProgressBar

  ProgressBar,进度条,是AndroidUI界面中一个非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比。因此它需要动态的显示进度,从而避免长时间的执行某个耗时的操作,而让用户感觉程序失去了相应,从而提高界面的友好性。

  从官方文档上看,为了适应不同的应用环境,Android内置了几种风格的进度条,可以通过Style属性设置ProgressBar的风格。支持如下属性,后面在示例中会一一展示:

  • @android:style/Widget.ProgressBar.Horizontal:水平进度条(可以显示刻度,常用)。
  • @android:style/Widget.ProgressBar.Small:小进度条。
  • @android:style/Widget.ProgressBar.Large:大进度条。
  • @android:style/Widget.ProgressBar.Inverse:不断跳跃、旋转画面的进度条。
  • @android:style/Widget.ProgressBar.Large.Inverse:不断跳跃、旋转动画的大进度条。
  • @android:style/Widget.ProgressBar.Small.Inverse:不断跳跃、旋转动画的小进度条。

  只有Widget.ProgressBar.Horizontal风格的进度条,才可以设置进度的递增,其他的风格展示为一个循环的动画,而设置Widget.ProgressBar.Horizontal风格的进度条,需要用到一些属性设置递增的进度,这些属性都有对应的setter、getter方法,这些属性如下:

  • android:max:设置进度的最大值。
  • android:progress:设置当前第一进度值。
  • android:secondaryProgress:设置当前第二进度值。
  • android:visibility:设置是否显示,默认显示。

   对于Widget.ProgressBar.Horizontal风格的进度条而言,在代码中动态设置移动量,除了可以使用setProgress(int)方法外,Android还为我们提供了另外一个incrementProgressBy(int)方法,它与setProgress(int)的根本区别在于,setProgress(int)是直接设置当前进度值,而incrementProgressBy(int)是设置当前进度值的增量(正数为增,负数为减)。与setProgress(int)和incrementProgressBy(int)对应的还有setSecondaryProgress(int)和incrementSecondaryProgressBy(int)方法,用于设置第二进度值。

  下面通过一个示例,来讲解一下上面的style设置样式的展示想过,以及动态控制进度条增减的实现。

  布局代码:

复制代码
 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" >
 6 
 7     <TextView
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:text="android:style/Widget.ProgressBar.Small" />
11 
12     <ProgressBar
13         style="@android:style/Widget.ProgressBar.Small"
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content" />
16 
17     <TextView
18         android:layout_width="wrap_content"
19         android:layout_height="wrap_content"
20         android:text="android:style/Widget.ProgressBar.Large" />
21 
22     <ProgressBar
23         android:id="@+id/pbLarge"
24         style="@android:style/Widget.ProgressBar.Large"
25         android:layout_width="wrap_content"
26         android:layout_height="wrap_content" />
27 
28     <TextView
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:text="android:style/Widget.ProgressBar.Inverse" />
32 
33     <ProgressBar
34         style="@android:style/Widget.ProgressBar.Inverse"
35         android:layout_width="wrap_content"
36         android:layout_height="wrap_content" />
37 
38     <TextView
39         android:layout_width="wrap_content"
40         android:layout_height="wrap_content"
41         android:text="android:style/Widget.ProgressBar.Small.Inverse" />
42 
43     <ProgressBar
44         style="@android:style/Widget.ProgressBar.Small.Inverse"
45         android:layout_width="wrap_content"
46         android:layout_height="wrap_content" />
47 
48     <TextView
49         android:layout_width="wrap_content"
50         android:layout_height="wrap_content"
51         android:text="android:style/Widget.ProgressBar.Large.Inverse" />
52 
53     <ProgressBar
54         style="@android:style/Widget.ProgressBar.Large.Inverse"
55         android:layout_width="wrap_content"
56         android:layout_height="wrap_content" />
57 
58     <TextView
59         android:layout_width="wrap_content"
60         android:layout_height="wrap_content"
61         android:text="android:style/Widget.ProgressBar.Horizontal" />
62 
63     <ProgressBar
64         android:id="@+id/pbHor"
65         style="@android:style/Widget.ProgressBar.Horizontal"
66         android:layout_width="match_parent"
67         android:layout_height="wrap_content"
68         android:max="100"
69         android:progress="20"
70         android:secondaryProgress="60" />
71 
72     <LinearLayout
73         android:layout_width="match_parent"
74         android:layout_height="match_parent"
75         android:orientation="horizontal" >
76         <!-- 设置一个按钮控制水平进度的递增 -->
77         <Button
78             android:id="@+id/btnAdd"
79             android:layout_width="wrap_content"
80             android:layout_height="wrap_content"
81             android:text="  +  " />
82         <!-- 设置一个按钮控制水平进度的递减 -->
83         <Button
84             android:id="@+id/btnReduce"
85             android:layout_width="wrap_content"
86             android:layout_height="wrap_content"
87             android:layout_marginLeft="30dp"
88             android:text="  -  " />
89         <!-- 设置一个按钮控制Style为large的进度显示与隐藏 -->
90         <Button
91             android:id="@+id/btnVisible"
92             android:layout_width="wrap_content"
93             android:layout_height="wrap_content"
94             android:layout_marginLeft="30dp"
95             android:text="VisibleLarge" />
96     </LinearLayout>
97 
98 </LinearLayout>
复制代码

   实现代码:

复制代码
 1 package com.bgxt.progressbarseriesdemo;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.view.View.OnClickListener;
 7 import android.widget.Button;
 8 import android.widget.ProgressBar;
 9 
10 public class ProgressBarActivity extends Activity {
11 
12     private Button btnAdd, btnReduce, btnVisible;
13     private ProgressBar pbHor, pbLarge;
14 
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_progressbar);
19 
20         btnAdd = (Button) findViewById(R.id.btnAdd);
21         btnReduce = (Button) findViewById(R.id.btnReduce);
22         btnVisible = (Button) findViewById(R.id.btnVisible);
23         pbHor = (ProgressBar) findViewById(R.id.pbHor);
24         pbLarge = (ProgressBar) findViewById(R.id.pbLarge);
25 
26         btnAdd.setOnClickListener(mathClick);
27         btnReduce.setOnClickListener(mathClick);
28         btnVisible.setOnClickListener(new View.OnClickListener() {
29 
30             @Override
31             public void onClick(View v) {
32                 // 判断Large进度条是否显示,显示则隐藏,隐藏则显示
33                 if (pbLarge.getVisibility() == View.VISIBLE) {
34                     pbLarge.setVisibility(View.GONE);
35                 } else {
36                     pbLarge.setVisibility(View.VISIBLE);
37                 }
38 
39             }
40         });
41     }
42 
43     private View.OnClickListener mathClick = new OnClickListener() {
44 
45         @Override
46         public void onClick(View v) {
47             switch (v.getId()) {
48             case R.id.btnAdd:
49                 // 如果是增加按钮,因为进度条的最大值限制在100,第一刻度限制在90.
50                 // 在此限度内,以1.2倍递增
51                 // 使用setProgress()
52                 if (pbHor.getProgress() < 90) {
53                     pbHor.setProgress((int) (pbHor.getProgress() * 1.2));
54                 }
55                 if (pbHor.getSecondaryProgress() < 100) {
56                     pbHor.setSecondaryProgress((int) (pbHor
57                             .getSecondaryProgress() * 1.2));
58                 }
59                 break;
60             case R.id.btnReduce:
61                 // 如果是增加按钮,因为进度条的最大值限制在100,第一刻度限制在10.第二刻度限制在20
62                 // 在此限度内,以10点为基数进行递减。
63                 // 使用incrementXxxProgressBy(int)
64                 if (pbHor.getProgress() > 10) {
65                     pbHor.incrementProgressBy(-10);
66                 }
67                 if (pbHor.getSecondaryProgress() > 20) {
68                     pbHor.incrementSecondaryProgressBy(-10);
69                 }
70                 break;
71             }
72         }
73     };
74 
75 }
复制代码

  展示效果:初始--递增--隐藏

  

SeekBar

  SeekBar,拖动条控件 ,间接继承自ProgressBar,所以与进度条类似,但是进度条采用颜色填充来表名进度完成的程度,而拖动条则通过滑动的位置来标识数值。

  SeekBar继承自ProgressBar,所以也继承了它的属性设置,上面介绍的一些属性在SeekBar中都可以用到。因为SeekBar涉及到一个滑块的概念,所以新增了属性android:thumb来通过设置一个Drawable对象,指定自定义滑块的外观,当然如果不设定也可以默认使用Android自带的风格。

  当用户按住滑块进行滑动的时候,会触发一个SeekBar.OnSeekBarChangeListener事件,这是一个接口,需要开发人员实现三个方法:

  • onProgressChanged(SeekBar seekBar,int progress,boolean fromUser):滑块在移动的时候响应。seekBar为触发事件的SeekBar控件,progress为当前SeekBar的滑块数值,fromUser为是否用户拖动产生的响应。
  • onStartTrackingTouch(SeekBar seekBar):滑块开始移动的时候响应。
  • onStopTrackingTouch(SeekBar seekBar):滑块结束移动的时候相应。

  下面通过一个示例来讲解一下SeekBar的基本用法。

复制代码
 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" >
 6         <TextView
 7             
 8         android:id="@+id/textview1"
 9         android:layout_width="match_parent" 
10         android:layout_height="30dp" />
11 
12     <TextView
13         android:id="@+id/textview2"
14         android:layout_width="match_parent"
15         android:layout_height="30dp" />
16 
17     <SeekBar       
18         android:layout_marginTop="30dp"
19         android:id="@+id/seekbar1"
20         android:layout_width="match_parent"
21         android:layout_height="wrap_content"
22         android:max="100"
23         android:progress="30" />
24     <!--设置一个拖动条,滑块为定义的bar图片-->
25     <SeekBar
26         android:layout_marginTop="30dp"
27         android:id="@+id/seekbar2"
28         android:layout_width="match_parent"
29         android:layout_height="wrap_content"
30         android:max="100"
31         android:progress="20"
32         android:thumb="@drawable/bar"
33         android:secondaryProgress="80" />
34 
35 </LinearLayout>
复制代码

  实现代码:

复制代码
 1 package com.bgxt.progressbarseriesdemo;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.widget.SeekBar;
 6 import android.widget.TextView;
 7 import android.widget.SeekBar.OnSeekBarChangeListener;
 8 
 9 public class SeekBarActivity extends Activity {
10     private TextView textview1, textview2;
11     private SeekBar seekbar1, seekbar2;
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         // TODO Auto-generated method stub
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.activity_seekbar);
17         
18         textview1 = (TextView) findViewById(R.id.textview1);
19         textview2 = (TextView) findViewById(R.id.textview2);
20         seekbar1 = (SeekBar) findViewById(R.id.seekbar1);
21         seekbar2 = (SeekBar) findViewById(R.id.seekbar2);
22 
23         seekbar1.setOnSeekBarChangeListener(seekBarChange);
24         seekbar2.setOnSeekBarChangeListener(seekBarChange);
25     }
26     private OnSeekBarChangeListener seekBarChange = new OnSeekBarChangeListener() {
27 
28         @Override
29         public void onStopTrackingTouch(SeekBar seekBar) {
30             if (seekBar.getId() == R.id.seekbar1) {
31                 textview1.setText("seekbar1停止拖动");
32             } else {
33                 textview1.setText("seekbar2停止拖动");
34             }
35         }
36 
37         @Override
38         public void onStartTrackingTouch(SeekBar seekBar) {
39             if (seekBar.getId() == R.id.seekbar1) {
40                 textview1.setText("seekbar1开始拖动");
41             } else {
42                 textview1.setText("seekbar2开始拖动");
43             }
44         }
45 
46         @Override
47         public void onProgressChanged(SeekBar seekBar, int progress,
48                 boolean fromUser) {
49             if (seekBar.getId() == R.id.seekbar1) {
50                 textview2.setText("seekbar1的当前位置是:" + progress);
51             } else {
52                 textview2.setText("seekbar2的当前位置是:" + progress);
53             }
54 
55         }
56     };
57 }
复制代码

  效果展示:

  

RatingBar

  RatingBar,星级评分控件,RatingBar与SeekBar的用法非常相似,并且具有相同的父类AbsSeekBar,AbsSeekbar又继承自ProgressBar。而RatingBar与SeekBar最大的区别在于:RatingBar通过星形图标来表示进度。

  RatingBar扩展了AbsSeekbar,所以新增了一些固有的属性,也屏蔽了一些无用的属性,如在RatingBar中就不存在第二进度的概念,新增的属性有如下几个:

  • android:isIndicator:设置是否允许用户修改,true为不允许,默认为false,允许。
  • android:numStars:设置评分控件一共展示多少个星星,默认5个。
  • android:rating:设置初始默认星级数。
  • android:stepSize:设置每次需要修改多少个星级。

  对于RatingBar而言,当改变其星级选项的时候,会触发一个RatingBar.OnRatingBarChangeListener事件,这是一个接口,需要实现其中的onRatingChanged(RatingBar ratingBar,float rating,boolean fromUser)方法,其中ratingBar表示触发事件的控件,rating表示当前的星级,fromUser表示是否用户触发的修改事件。

  在这里需要注意的一点就是,因为继承关系,RatingBar也有Progress属性,但是还有另外一个属性rating表示星级。这两个属性代表的意义是有区别的,区别在于Progress属性针对的是Max属性设置的值而言的,而rating是单纯的表示第几颗星。

  下面通过一个示例来展示一下评分控件的基本使用。

  布局代码:

复制代码
 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" >
 6 
 7     <TextView
 8         android:layout_width="match_parent"
 9         android:layout_height="wrap_content"
10         android:text="评分控件的使用"
11         android:textSize="20dp" />
12 
13     <RatingBar
14         android:id="@+id/rbRating"
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content" />
17 
18     <RatingBar
19         android:id="@+id/rbRating1"
20         android:layout_width="wrap_content"
21         android:layout_height="wrap_content"
22         android:isIndicator="false"
23         android:max="100"
24         android:numStars="4"
25         android:rating="2.5"
26         android:stepSize="0.5" />
27 
28 </LinearLayout>
复制代码

  实现代码:

复制代码
 1 package com.bgxt.progressbarseriesdemo;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.widget.RatingBar;
 6 import android.widget.RatingBar.OnRatingBarChangeListener;
 7 import android.widget.Toast;
 8 
 9 public class RatingBarActivity extends Activity implements OnRatingBarChangeListener {
10 
11     private RatingBar rbRating,rbRating1;
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_ratingbar);
16         rbRating=(RatingBar)findViewById(R.id.rbRating);
17         rbRating1=(RatingBar)findViewById(R.id.rbRating1);
18         //手动设置第一个RatingBar的属性值
19         rbRating.setMax(100);
20         rbRating.setProgress(20);
21         rbRating.setOnRatingBarChangeListener(this);
22         rbRating1.setOnRatingBarChangeListener(this);
23     }
24     @Override
25     public void onRatingChanged(RatingBar ratingBar, float rating,
26             boolean fromUser) {
27         //分别显示Progress属性和rating属性的不同
28         int progress=ratingBar.getProgress();
29         Toast.makeText(RatingBarActivity.this, "progress:"+progress+" rating :"+rating,Toast.LENGTH_SHORT).show();
30     }
31     
32 }
复制代码

  展示效果:

  示例代码下载

总结

  以上就详细说明了ProgressBar控件以及其两个子控件的用法,此处不包括控件样式的设置,对于控件的展示效果,以后再进行详解。

  请支持原创,尊重原创,转载请注明出处。谢谢。

分享到:
评论

相关推荐

    Android---UI篇

    •Andorid---UI篇---两种进度条(ProgressBar) • •Android---UI篇---Dialog(对话框) • •Android---UI篇---AutoCompleteTextView(自动提示) • •Android---UI篇---Toast(提示) • •Android---UI篇---...

    AndroidProgressBar-几乎全部的用法.zip

    这个资源包"AndroidProgressBar-几乎全部的用法.zip"显然是为了帮助开发者全面了解如何在Android应用中有效地使用ProgressBar。以下是对这个主题的详细讲解: 1. **ProgressBar类型**: - **Circular ProgressBar*...

    android-testnotification-progressbar

    在Android开发中,`testnotification`和`progressbar`是两个重要的元素,它们分别涉及到系统通知的测试和进度条的显示。本文将详细讲解如何在Android应用中实现`testnotification`和`progressbar`的同时刷新,以及...

    Android代码-仿知乎的横线直线progressbar.rar

    【标题】"Android代码-仿知乎的横线直线progressbar.rar" 涉及的是在Android平台上开发一个类似于知乎应用中的进度条组件。这个组件通常用于显示任务或数据加载的进度,给用户一种视觉反馈,表明应用程序正在执行...

    AndroidProgressBar_Android ProgressBar进度条的几乎全部的用法源码集.rar

    在Android开发中,ProgressBar是用户界面(UI)设计中不可或缺的一部分,它用于向用户展示某个操作的进度或等待状态。本资源"AndroidProgressBar_Android ProgressBar进度条的几乎全部的用法源码集.rar"提供了关于...

    Android之UI--打造12种不同Dialog对话框

    在Android开发中,UI设计是至关重要的一环,而Dialog对话框则是用户交互界面中的常见元素。本文将深入探讨如何打造12种不同类型的Dialog对话框,以满足各种场景下的需求。通过阅读CSDN博主dickyqie的文章,我们可以...

    Android下ProgressBar和旗下两个子控件的使用

    总的来说,ProgressBar、SeekBar和RatingBar都是Android UI设计中的重要组件,它们提供了丰富的用户体验和反馈机制。理解并熟练运用这些控件,能让你的Android应用更加易用和专业。通过不断的实践和学习,开发者可以...

    progressbar-加text显示

    在Android开发中,ProgressBar是一个非常常见的UI组件,用于表示某个操作的进度,比如数据加载、文件上传等。在用户界面中,为了提供更好的用户体验,我们往往希望不仅展示进度条,还要同时显示进度的具体数值或者...

    Android代码-带文字的ProgressBar.zip

    在Android开发中,ProgressBar是用户界面(UI)设计中常用的一种组件,用于向用户显示一个正在进行的操作进度。当应用程序执行耗时操作,如网络请求、数据加载或计算时,使用ProgressBar可以提供良好的用户体验,让...

    Android 自定义各式各样的圆形ProgressBar

    在Android开发中,ProgressBar是用户界面(UI)设计中一个重要的元素,用于向用户展示某个操作的进度或者等待状态。通常,系统提供的ProgressBar样式有限,但开发者可以通过自定义来实现更多样化的效果,以满足不同...

    ProgressBar-master.zip

    总的来说,`ProgressBar-master.zip`是一个很好的学习资源,可以帮助开发者深入理解Android UI自定义,并提升应用的用户体验。通过研究这个项目,你可以学习到如何扩展Android的基础组件,以及如何通过代码和布局...

    Android-UI.rar_Android经典界面_android_android ui

    在Android应用开发中,UI(用户界面)设计是至关重要的,因为它直接影响到用户的体验和对应用的接受程度。本资源“Android-UI.rar”提供了一系列经典的Android界面设计实例,非常适合初学者参考学习,以理解并掌握...

    android - progressBar

    在Android开发中,`ProgressBar`是一个非常常见的组件,它用于显示进度或加载状态。这个组件在用户界面中扮演着重要...总之,`ProgressBar`是Android UI设计中不可或缺的一部分,正确使用它可以极大地提升用户体验。

    android-UI控件

    在Android开发中,UI(User Interface)控件是构建用户界面不可或缺的部分,它们负责展示信息并与用户进行交互。本实验二“android-UI控件”深入探讨了Android平台上的各种UI组件及其用法,旨在帮助开发者创建功能...

    Android代码-安卓ui设计

    在Android开发中,UI设计是至关重要的,因为它直接影响到应用程序的用户体验。Android Studio作为Google官方推荐的集成开发环境(IDE),提供了丰富的工具和技术来帮助开发者创建美观且功能强大的用户界面。"MyUi...

    android progressbar使用系列集合

    总之,自定义Android的ProgressBar涉及到对样式、背景、进度条颜色以及额外视图的调整,这需要对Android的UI组件和布局有深入理解。通过以上步骤,你可以根据项目的具体需求创建出独特且富有视觉吸引力的进度指示器...

    Android-Loader-Progressbar-with-backbutton

    本项目“Android-Loader-Progressbar-with-backbutton”结合了这两个元素,同时考虑了回退按钮的功能,旨在创建一个更全面的用户交互体验。 1. **Loader**: Android的Loader API是设计来异步加载数据到UI中,避免...

    Android应用源码之ProgressBar 几乎全部的用法-IT计算机-毕业设计.zip

    同时,考虑到这是一个毕业设计相关的资源,可能还包含了如何将ProgressBar与其他UI元素集成,以及如何设计美观的进度条样式。你可能还会发现如何通过自定义View扩展ProgressBar的功能,比如改变进度条的颜色、形状...

    android中自定义progressbar组件

    在Android开发中,自定义组件是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,提升应用的用户体验。...通过这样的实践,开发者可以更好地理解Android的UI体系,并提升自定义组件的能力。

    Android带文字的ProgressBar-Demo源码.zip

    "Android带文字的ProgressBar-Demo源码.zip"提供的就是一个实现这一功能的示例代码。 首先,我们来看如何在Android中创建一个带有文字的ProgressBar。通常,这可以通过自定义View或者使用现有的库来实现。一种常见...

Global site tag (gtag.js) - Google Analytics