android学习笔记(25)进度条(ProgressBar)的功能和用法

2014-12-24 9:18:36     35 人阅读    

进度条(ProgressBar)的功能和用法
图2.32选择日期、时间
进度条也是UI界面中的一种非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比。因此进度条可以动态地显示进度,因此避免长时间地执行某个耗时操作时,让用 户感觉程序失去了响应,从而更好地提高用户界面的友好性。
Android支持几种风格的进度条,通过style属性可以为ProgressBar指定风格。该属性可支持如下几个属性值。
@android:style/Widget.ProgressBar.Horizontal:水平进度条。
 @android:style/Widget.ProgressBar.lnverse••不断跳跃、旋转画面的进度条。
@android:style/Widget.ProgressBar.Large:大进度条。
@android:style/Widget.ProgressBar.Large.Inverse:不断©版、旋转画面的大进度条。
@android:style/Widget.ProgressBar.SmalU 小进度条。
@android:style/Widget.ProgressBar.Small.lnverse:不断跳跃、旋转画面的小进度条。 除此之外,ProgressBar还支持如表2.15所示的常用XML属性。
表2.15 ProgressBar常用的XML厲性
XML厲性                                                       说 明                                

android: max                                      设该进度条的城大值                           

android: progress                               设W该进度条的己完成进度值
android :progressDrawable                 设®该进度条的轨道的绘制形式
android: progressB arSty le                 默认进度条样式
android :progressBarStyleHonzontal  水平进度条样式
android: progressBarSty leLarge        大进度条样式
android: progrcssBarSty leSmall        小进度条样式

表2.15中android:progressDrawable用于指定进度条的轨道的绘制形式,该属性可指定为 一个LayerDrawable对象(该对象可通过在XML文件中用<layer-list>元素进行配置)的引用。 ProgressBar提供了如下方法来操作进度。
setProgress(int):设置进度的完成百分比。
incrementProgressBy(int):设置进度条的进度增加或减少。当参数为正数时进度增
加;当参数为负数时进度减少。
下面的程序简单示范了进度条的用法,该程序的界面布局文件只是定义了一个简单的进 度条,并指定 style 属性为@android:style/Widget.ProgressBar.Horizontal,即水平进度条。界面布局文件如下。
程序清单:\ProgressBarTest\res\layout\main.xml <?xml version="1.0" encoding="utf-8"?>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<TextView 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:text="任务完成的进度"
 />
<!-- 定义一个水平进度条 -->
<ProgressBar
 android:id="@+id/bar"
  android:layout_width="fill_parent" 
 android:layout_height="wrap_content"
 android:max="100"
 style="@android:style/Widget.ProgressBar.Horizontal"
 />
<!-- 定义一个水平进度条,并改变轨道外观 -->
<ProgressBar
 android:id="@+id/bar2"
  android:layout_width="fill_parent" 
 android:layout_height="wrap_content"
 android:max="100"
 android:progressDrawable="@drawable/my_bar"
 style="@android:style/Widget.ProgressBar.Horizontal"
 />
</LinearLayout>

上面的布局文件中定义的2个进度条的最大值为100,第一个进度条的样式为水平进度 条;第二个进度条的外观被定义S@drawable/my_bar,因此我们还需要在drawable-mdpi中 定义如下文件。
程序清单:\\res\drawable-mdpi\my_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/no" />
 <!-- 定义轨道上已完成部分的样式 -->
 <item android:id="@android:id/progress"
  android:drawable="@drawable/ok" />
</layer-list>     


下面的主程序用一个填充数组的任务模拟了耗时操作,并以进度条来标识任务的完成百 分比,主程序如下。
程序清单:codes\02\2.4\ProgressBarTest\src\org\crazyit\progress\ProgressBarTest.java

package org.crazyit.progress;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ProgressBar;


public class ProgressBarTest extends Activity
{
 //该程序模拟填充长度为100的数组
 private int[] data = new int[100];
 int hasData = 0;
 //记录ProgressBar的完成进度
 int status = 0; 
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  final ProgressBar bar = (ProgressBar) findViewById(R.id.bar);
  final ProgressBar bar2 = (ProgressBar) findViewById(R.id.bar2);
  //创建一个负责更新的进度的Handler
  final Handler mHandler = new Handler()
  {
   @Override
   public void handleMessage(Message msg)
   {
    //表明消息是由该程序发送的。
    if (msg.what == 0x111)
    {
     bar.setProgress(status);
     bar2.setProgress(status);
    }
   }
  };
  //启动线程来执行任务
  new Thread()
  {
   public void run()
   {
    while (status < 100)
    {
     // 获取耗时操作的完成百分比
     status = doWork();
     // 发送消息到Handler
     Message m = new Message();
     m.what = 0x111;
     // 发送消息
     mHandler.sendMessage(m);
    }
   }
  }.start();
 }
 //模拟一个耗时的操作。
 public int doWork()
 {
  //为数组元素赋值
  data[hasData++] = (int)(Math.random() * 100);
  try
  {
   Thread.sleep(100);
  }
  catch (InterruptedException e)
  {
   e.printStackTrace();
  }
  return hasData;
 }
}


上面的程序中粗体字代码用于修改进度条的完成进度。运 行上面的程序,将看到如图2.33所示界面。
实例:显示在标题上的进度条
还有一种进度条,它可以直接在窗口标题上显示,这种进度条甚至不需要使用 ProgressBar组件,它是直接由Activity的方法启用的。为了在窗口上显示进度条,需要经过如下两步。
          调用Activity的requestWindowFeatureO方法,该方法根据传入的参数可启用特走的 窗口特征,例如传入 Window.FEATURE_INDETERMINATE_PROGRESS 在窗口标题上M示 不带进度的进度条;传入Window.FEATURE_PROGRESS则显示带进度的进度条。
0调用 Activity 的 setProgressBarVisibility(boolean)或 setProgressBarlndeterminate Visibility(boolean)方法即可控制进度条的显示和隐藏。
例如下面的程序,界面布局中仅仅定义了两个按钮,此处不再给出界面布局文件。该程 序的Activity类代码如下。
程序清单:codes\02\2.4\TitleProgressBar\src\org\crazyit\progress\TitleProgressBar.java

package org.crazyit.progressbar;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

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.bn01);
  Button bn2 = (Button)findViewById(R.id.bn02);
  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);
   }
  }); 
 }
}


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


原文地址:http://www.itmmd.com/201412/370.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

产品经理学习笔记(13)-用户反馈的意义   上一篇
下一篇  android学习笔记(24)日期、时间选择框(DatePicker和TimePicker)的功能和用法

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!