1. 程式人生 > >Android-ProgressBar實現進度條

Android-ProgressBar實現進度條

進度條ProgressBar的使用主要呦兩種方向;

1.使用官方預設樣式

2.使用自定義樣式

先看效果:

詳細程式碼實現文末給出

關於系統自帶樣式:

在 style="@android:style 中有許多系統自帶樣式,大家可以更具自身喜好選擇。

如果不選擇 style 系統會預設使用上圖中紅色的樣式。

關於自定義樣式:

這裡我們最好看看原始碼 很容易理解

主要分為三個部分:當前進度、緩衝進度、以及背景 三個屬性

這裡我們通過在drawable裡新建my_bar.xml來實現

這裡有個注意點  很多人寫了xml後發現 直接就顯示滿進度

而不是緩慢增長

由於是替換系統自帶樣式,所以id必須與系統保持一致:(如:android:id="@android:id/background")

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

這裡對比下系統原始碼就很好理解了:

這裡的模擬方法採用的是執行緒結合Handler

由於執行緒不能直接改變控制元件屬性 所以需要用Handler來接受執行緒發出的Message

具體方法如下:

public class MainActivity extends Activity {
    //記錄ProgressBar的完成進度
    private int sum1=0,sum2 = 0 ;
    ProgressBar bar1,bar2;
    //建立一個負責更新進度的Handler
    Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //表明訊息是本程式傳送的
            if (msg.what == 0x111){
                bar1.setProgress(sum1);
                bar2.setProgress(sum2);
            }

        }
    };
    //模擬耗時
    Thread thread = new Thread(){
        @Override
        public void run() {
            while (sum2 < 100){
                //bar1獲取完成工作的百分比
                if (sum1 > 100){
                    sum1 = 100;
                    if (sum2<100){
                        sum2 += (int) (Math.random()*25);
                    }else {
                        sum2 = 100;
                        thread.stop();
                    }
                    sum1=0;
                }else {
                    sum1 = sum1 + (int) (Math.random()*25);
                }
                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                //更新ProgressBar
                mHandler.sendEmptyMessage(0x111);
            }

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bar1 = (ProgressBar) findViewById(R.id.bar);
        bar2 = (ProgressBar) findViewById(R.id.bar2);
        thread.start();
    }


}

最後在給出佈局檔案:

<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:contentInsetStart="0dp"
        android:background="#9FB6CD">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ProgressBar
                android:id="@+id/toolbar_progress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true" />

        </RelativeLayout>
    </android.support.v7.widget.Toolbar>

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