1. 程式人生 > >Android ProgressBar分析及自定義ProgressBar

Android ProgressBar分析及自定義ProgressBar

轉:http://www.cnblogs.com/glimpse/p/5273046.html

rogressBar是在執行耗時操作時的一種人性化設計。分為兩種形式:轉圈的,能顯示進度的。

而能取決於是什麼樣式的PregressBar,當然就是PregressBar的樣式啦~

Widget.ProgressBar.Horizontal  水平進度條
Widget.ProgressBar.Small    小環形進度條
Widget.ProgressBar.Large    大環形進度條 Widget.ProgressBar.Inverse   普通大小的環形進度條 Widget.ProgressBar.Small.Inverse  小環形進度條 Widget.ProgressBar.Large.Inverse  大環形進度條

首先講一下能夠顯示進度的ProgressBar.
定義帶進度條的progressbar除了需要設定style以外還要設定一個最大值max,表示進度的結束值。
如下可以通過xml來設定,除此之外還可以在程式碼中使用setMax來設定:
複製程式碼
<!-- 定義一個水平進度條 -->
<ProgressBar
    android:id="@+id/bar"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:max="100"
    style="@android:style/Widget.ProgressBar.Horizontal"
    />
複製程式碼

然後在使用的時候,在進度達到不同的情況下,設定一下進度就能顯示相應的變化啦~

複製程式碼
package org.crazyit.ui;

public class ProgressBarTest extends Activity { // 該程式模擬填充長度為100的陣列 private int[] data = new int[100]; int hasData = 0; // 記錄ProgressBar的完成進度 int status = 0; ProgressBar bar; // 建立一個負責更新的進度的Handler Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {
// 表明訊息是由該程式傳送的 if (msg.what == 0x111) { bar.setProgress(status);//設定進度 } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bar = (ProgressBar) findViewById(R.id.bar); // 啟動執行緒來執行任務 new Thread() { public void run() { while (status < 100) { // 獲取耗時操作的完成百分比 status = doWork(); // 傳送訊息 mHandler.sendEmptyMessage(0x111); } } }.start(); } // 模擬一個耗時的操作 public int doWork() { // 為陣列元素賦值 data[hasData++] = (int) (Math.random() * 100); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } return hasData; } }
複製程式碼

好吧,這些都是直接用的書裡的示例程式碼。紅色程式碼就是設定相應的進度啦~

程式碼裡線上程中執行了模擬耗時操作dowork函式,當然最常用的是把dowork函式換成下載函式。

當然使用完畢我們並不希望再看到他,這個時候呼叫一下

bar.setVisibility(View.GONE);

就好啦~

自定義ProgressBar

當然很多情況,我們是不大會用他們原本的樣式的,會自定義一下這些東西。

首先講一下環形進度條xml原始碼。

<!-- 定義一個大環形進度條 -->
<ProgressBar
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    style="@android:style/Widget.ProgressBar.Large"
    />

看這個樣子,奧祕只能在style裡面,讓我們進去看看~

複製程式碼
<style name="Widget.ProgressBar.Large">
        <item name="android:indeterminateDrawable">@android:drawable/progress_large_white</item>
        <item name="android:minWidth">76dip</item>
        <item name="android:maxWidth">76dip</item>
        <item name="android:minHeight">76dip</item>
        <item name="android:maxHeight">76dip</item>
    </style>
複製程式碼

這個地方長這個毛線樣,分別定義了圖片資源和寬高,那麼可想而知,我們要改的是圖。然後再進@android:drawable/progress_large_white裡面去看一下~

這個時候已經沒有連結了,我們直接去sdk裡找,具體位置是:D:\Java\android-sdk-windows\platforms\android-19\data\res\drawable

找progress_large_white.xml看一下。

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_black_76"
    android:pivotX="50%"
    android:pivotY="50%"
    android:framesCount="12"
    android:frameDuration="100" />

啊,原來是這樣的~我們修改一下drawable不就得了,那來吧~

首先找一張圖片放進資原始檔夾裡

然後寫一個上面那樣的animated-rotate,把android:drawable的值換成自己的圖片資源。

再然後就是寫一個style,把裡面的android:indeterminateDrawable的值換成自己寫的animated-rotate檔名。

再再然後就是在progressbar裡面的style的值換成自己寫的style,重新來一遍就是了~

然後再說一說水平進度條啦~

因為水平進度條有完成和沒完成之分,我們自定義主要就是自定義這兩邊的樣子~

這個你就在progressbar裡面加一個progressDrawable。

複製程式碼
<!-- 定義一個水平進度條,並改變軌道外觀 -->
<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"/>
複製程式碼

然後res/drawable-mdpi目錄裡面需要放一個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/no" />
    <!-- 定義軌道上已完成部分的樣式 -->
    <item android:id="@android:id/progress"
        android:drawable="@drawable/ok" />
</layer-list>
複製程式碼

然後你就找兩個圖放上去就好啦~

但是,這兩種自定義只是換下背景圖而已,基本的樣子還是沒有發生什麼變化。其實我們可以做一個小動畫(比如韓寒的One裡面的那棵不斷生長的向量樹用的就是逐幀動畫),執行耗時操作的時候調用出來,執行完畢撤銷~