2014-2-14ProgressBar及其子類

1.進度條(ProgressBar)的功能與用法

       ProgressBar組件本身代表了進度條組件,它還派生了兩個常用組件:SeekBar和RatingBar.

       進度條通常用於向用戶顯示某個耗時操作完成的百分比,通過style屬性可以爲ProgressBar指定風格(水平進度條、環形進度條等)

       Xml屬性中,android:progressDrawable用於指定進度條的軌道的繪製形式,該屬性可指定一個LayoutDrawable對象(該對象可通過在Xml文件中用<layer-list>元素進行配置)

實例:

界面佈局文件:

<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>

       Ps:上面定義了三個環形進度條,這些進度條無法顯示進度,只顯示一個不斷旋轉的圖片。佈局文件定義兩個水平進度條的最大值爲100,第二個外觀被定義爲@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>
    <!-- 定義軌道上已完成部分的樣式 -->
    <item android:id="@android:id/progress"
        android:drawable="@drawable/ok"/>
</layer-list>

Activity代碼清單,用一個填充數組的任務模擬了耗時操作,並以進度條來標識任務的完成百分比:

public class ProgressBarT extends Activity {
 
    //該程序模擬填充長度爲100的數據
    private int[] data = new int[100];
    int hasDate = 0;
    //記錄ProgressBar的完成進度
    int status = 0;
    ProgressBar bar, bar2;
    //創建一個負責更新的進度的Handler
    Handler mHandler = new Handler()
    {
       public voidhandleMessage(Message msg)
       {
           //表明信息是由該程序發送的
           if (msg.what == 0x111)
           {
              bar.setProgress(status);
              bar2.setProgress(status);
           }
       }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.progress_bar_t);
        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[hasDate++] = (int) (Math.random()*100);
        try
        {
           Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
           e.printStackTrace();
        }
        return hasDate;
    }
}

效果:

實例2:顯示在標題上的進度條

       這種進度條直接由Activity的方法啓用爲在窗口上顯示進度條,需經如下兩部:

1.       調用Activity的requestWindowFeature()方法,該方法根據傳入的參數可啓用特定的窗口特徵。

2.       調用Activity的setProgressBarIndeterminateVisibility(boolean)或

setProgressBarVisibility(boolean)方法即可控制進度條的顯示和隱藏。

Activity代碼清單

public class TitleProgressBarT extends Activity {
 
    Button bn1, bn2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設置窗口特徵:啓動顯示進度的進度條
        requestWindowFeature(Window.FEATURE_PROGRESS);
        //設置窗口特徵:啓用不顯示進度的進度條
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.title_progress_bar_t);
        bn1 = (Button) findViewById(R.id.bn1);
        bn2 = (Button) findViewById(R.id.bn2);
        bn1.setOnClickListener(new OnClickListener()
        {
 
           @Override
           public void onClick(View v) {
              //顯示不帶進度的進度條
              setProgressBarIndeterminateVisibility(true);
              //顯示帶進度的進度條
              setProgressBarVisibility(true);
              //設置進度條的進度
              setProgress(4500);
           }
        });
        bn2.setOnClickListener(new OnClickListener()
        {
 
           @Override
           public void onClick(View v) {
              //顯示不帶進度的進度條
              setProgressBarIndeterminateVisibility(false);
              //顯示帶進度的進度條
              setProgressBarVisibility(false);
           }
        });
    }
}

效果:

2.拖動條(SeekBar)的功能和用法

       拖動條與進度條非常相似,只是拖動條通過滑塊位置來表示數值—而且拖動條允許用戶拖動滑塊來改變值。

       改變滑塊外觀可通過如下屬性android:thumb:指定一個Drawable對象,該對象將作爲自定義滑塊。

       爲了讓程序響應拖動條滑塊位置變化,程序可以考慮爲它綁定一個OnSeekBarChangeListener監聽器。

       實例:

線性佈局一個圖片組件、一個拖動條

<ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="240px"
        android:src="@drawable/p1"/>
    <!-- 定義一個拖動條,並改變它的滑塊外觀 -->
    <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"/>

PS:該拖動條的最大值、當前值都是255,android:thumb屬性是改變拖動條滑塊的外觀。

Activity中綁定一個監聽器,動態改變圖片透明度:

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
        {
 
            //當滑動條的滑塊位置發生改變時觸發該方法
           @Override
           public void onProgressChanged(SeekBar arg0, int progress,
                  boolean fromUser) {
              //動態改變圖片的透明度
              image.setAlpha(progress);
           }
 
           @Override
           public void onStartTrackingTouch(SeekBar arg0) {
             
           }
 
           @Override
           public void onStopTrackingTouch(SeekBar arg0) { 
          
}
        });

效果:

3.星級評分條(RatingBar)功能用法

       星級條與拖動條有相同父類AbsSeekBar,很相近。

       爲讓程序響應星級評分條的改變,程序可以考慮爲它綁定一個onRatingChanged監聽器。

    實例:

界面佈局RatingBar代碼段

   

 <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"
        />

主程序爲RatingBar綁定事件監聽器

rating.setOnRatingBarChangeListener(new OnRatingBarChangeListener()
        {
 
           @Override
           public void onRatingChanged(RatingBarratingBar, float rating,
                  boolean fromUser) {
              // 動態改變圖片透明度,其中255是星級評分條最大值
              //5個星星就是代表最大值255
              image.setAlpha((int) (rating * 255) / 5);
           }
           
        });

效果:

PS:程序報錯“不能引用另一方法中定義的內部類中非終態變量 image”

原因:因爲內部類本身是方法內的臨時變量,只存在於方法內。

       所以需將image改爲“final image”或在方法外定義。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章