进度条是UI界面中一种非常实用的组件,通常用于向用户像是某个耗时操作完成的百分比。进度条可动态地显示进度,因此避免长时间地执行某个操作时,让用户感觉程序失去了响应,从而更好地提高用户界面的友好性。ProgressBar本身代表着进度条组件,其子类还包括SeekBar(拖动条)和RatingBar(星级评分条)。
一、ProgressBar使用详解
1.环形进度条使用方法
(1)进度条样式
(2)代码实现
- <ProgressBar android:id="@+id/progressBar"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- style="@android:style/Widget.ProgressBar.Large"/>
总结:我们可以通过设置ProgressBar的style属性实现不同大小的环形进度条,
ProgressBar常用的XML属性如下
(1)android:max:设置该进度条的最大值;
(2)android:progress:设置该进度条的已完成进度值;
(3)android:progressDrawable:设置该进度条的轨道对应的Drawable对象;
(4)android:indeterminate:该属性设为true,设置进度条不精确显示进度;
(5)android:indeteminateDrawable:设置绘制不显示进度的进度条的Drawable对象;
(6)android:indeteminateDuration:设置不精确显示进度的持续时间
(7)style属性:设置进度条的风格,支持以下几个属性
◇@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:小环形进度条
2.显示进度精度进度条使用方法
(1)进度条样式
(2)代码实现
>业务逻辑代码:模拟进度条的进度显示
- public class MainActivity extends ActionBarActivity {
- private int[] data = new int[100];
- int hasData = 0;
- int status = 0;
- ProgressBar bar, bar1;
- // 创建一个负责更新的进度的Handler
- Handler handler = new Handler() {
- public void handleMessage(android.os.Message msg) {
- if (msg.what == 0x111) {
- bar.setProgress(status);
- bar1.setProgress(status);
- }
- };
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- bar = (ProgressBar) findViewById(R.id.progressBar);
- bar1 = (ProgressBar) findViewById(R.id.progressBar1);
- // 启动线程来执行任务
- new Thread(new Runnable() {
- public void run() {
- while (status < 100) {
- status = doWork(); // 获取耗操作的完成百分比
- handler.sendEmptyMessage(0x111); // 发送消息
- }
- }
- }).start();
- }
- // 模拟一个耗时任务
- public int doWork() {
- data[hasData++] = (int) (Math.random() * 100);
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return hasData;
- }
- }
>布局:
- <ProgressBar
- android:id="@+id/progressBar"
- style="@android:style/Widget.ProgressBar.Horizontal"
- android:layout_width="match_parent"
- android:layout_height="100dp"
- android:max="100" />
- <ProgressBar
- android:id="@+id/progressBar1"
- style="@android:style/Widget.ProgressBar.Horizontal"
- android:layout_width="match_parent"
- android:layout_height="100dp"
- android:max="100"
- android:progressDrawable="@drawable/mybar" />
其中,mybar.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/ic_launcher"/>
- <!-- 定义轨道上已经完成部分的样式 -->
- <item
- android:id="@android:id/progress"
- android:drawable="@drawable/android"/>
- </layer-list>
3.对话框进度条
(1)进度条样式
(2)代码实现
- final ProgressDialog mypDialog=new ProgressDialog(MainActivity.this); //实例化一个进度条对话框
- mypDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //设置进度条风格
- mypDialog.setTitle("进度条对话框演示"); //设置进度条标题
- mypDialog.setMessage("任务正在执行中,请稍后"); //设置提示信息
- mypDialog.setIcon(R.drawable.android); //设置图标
- mypDialog.setIndeterminate(true); //设置是否精度显示进度
- mypDialog.setCancelable(false); //设置是否触屏取消
- mypDialog.setButton(DialogInterface.BUTTON_POSITIVE, "取消执行", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) { //设置按钮
- mypDialog.dismiss();
- } });
- mypDialog.show();
4.向AlertDialog对话框中加入进度条
(1)进度条样式
(2)代码实现
- myup=(Button) myLayout.findViewById(R.id.myView_BT_Up);(myProgressBar.incrementProgressBy(5);)
- mydown=(Button) myLayout.findViewById(R.id.myView_BT_Down);(myProgressBar.incrementProgressBy(-5);)
- myprogress=(ProgressBar)myLayout.findViewById(R.id.myView_ProgressBar);
- AlertDialog alertDialog = new AlertDialog(this);
- LayoutInflater layoutInflater=(LayoutInflater) getSystemService(this.LAYOUT_INFLATER_SERVICE);
- LinearLayout myLayout=(LinearLayout) layoutInflater.inflate(R.layout.myview, null);
- myProgressBar.setProgress(Tag); //进度条进度初始值为0
- alertDialog.setTitle("长形进度条");
- alertDialog.setIcon(R.drawable.Android);
- alertDialog.setMessage("测试View加入进度条");
- alertDialog.setView(myLayout);
- alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener(){
- public void onClick(DialogInterface dialog, int which) {
- Tag=myProgressBar.getProgress(); //获得当前进度条的值
- }});
- AlterD.show();
其中,R.layout.myview.xml代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal" >
- <Button
- android:id="@+id/myView_BT_Down"
- android:layout_width="50dp"
- android:layout_height="wrap_content"
- android:text="-" >
- </Button>
- <ProgressBar
- android:id="@+id/myView_ProgressBar"
- style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="178dp"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:progress="57" >
- </ProgressBar>
- <Button
- android:id="@+id/myView_BT_Up"
- android:layout_width="50dp"
- android:layout_height="wrap_content"
- android:text="+" >
- </Button>
- </LinearLayout>
二、在标题上显示进度条方法
1.主要步骤如下
(1)首先,调用Activity的requestWindowFeature()方法,该方法根据传入的参数可启用特定的窗口特征。例如传入Window.FEATURE_INDETERMINATE_PROGRESS在窗口标题上显示不带进度条的进度条;传入Window.FEATURE_PROGRESS则显示带进度的进度条。
(2)然后,调用Activity的SetProgressBarVisibility(boolean)或setProgressBarIndeterminateVisibility(boolean)方法即可控制进度条的显示和隐藏。
2.代码如下
- protected void onCreate(Bundle savedInstanceState) {
- //设置窗口特征:启动显示进度的进度条
- requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- //设置窗口特征:启动显示不带进度的进度条
- // requestWindowFeature(Window.FEATURE_PROGRESS);
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btn1 = (Button)findViewById(R.id.btn1);
- btn1.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- // setProgressBarVisibility(true);
- setProgressBarIndeterminateVisibility(true);
- }
- });
- }
- }