1. 程式人生 > >Android 控制元件ProgressBar進度條

Android 控制元件ProgressBar進度條

                             Android 控制元件---ProgressBar進度條

下面詳細介紹ProgressBar

一、說明

  在某些操作的進度中的可視指示器,為使用者呈現操作的進度,視訊一般都有進度條,用來顯示中間進度,如在流媒體播放的緩衝區的進度。

二、常用屬性

    style="?android:attr/progressBarStyle"     預設為圓形

    style="?android:attr/progressBarStyleHorizontal"    水平樣式

              android:max="100"    設定最大值

              android:progress="33"   設定當前進度

三、重要方法

    getMax():返回這個進度條的範圍的上限

    getProgress():返回進度

    getSecondaryProgress():返回次要進度

    incrementProgressBy(int diff):指定增加的進度

    isIndeterminate():指示進度條是否在不確定模式下

    setIndeterminate(boolean indeterminate):設定不確定模式下

    setVisibility(int v):設定該進度條是否可視

         注意:1、給執行緒設定休眠會出現錯誤                         Thread.sleep(100);//拋異常           SystemClock.sleep(100);//不會拋異常

                   2、不能在主執行緒中執行耗時的操作,只能在子執行緒中操作 ,             

                        另外,在子執行緒中不能操作主執行緒中的控制元件 (ProgressBar除外)

四、重要事件

    onSizeChanged(int w, int h, int oldw, int oldh):當進度值改變時引發此事件

五、例項

1.佈局檔案 (activity_main.xml程式碼)

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

   <FrameLayout
       android:layout_width="match_parent"
       android:layout_height="60dp">
       <TextView
           android:id="@+id/tv_main_tv1"
           android:layout_width="60dp"
           android:layout_height="match_parent" />
        <ProgressBar
            android:id="@+id/pb_main_pb1"
            android:layout_width="match_parent"
            style="?android:attr/progressBarStyleHorizontal"
            android:max="100"
            android:layout_height="60dp" />
   </FrameLayout>

    <Button
        android:id="@+id/btn_main_btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="setProcess"/>

</LinearLayout>

2、程式碼檔案(MainActivity.java程式碼)

package com.example.a0911_homework_05;


import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

   //初始化控制元件
    private ProgressBar pb_main_pb1;
    private int progress;
    private TextView tv_main_tv1;
    private myHandler myHandler = new myHandler();

    private int code = 1;//代表哪一部視訊
    private class myHandler extends Handler{//通過Handler給主執行緒傳送資訊
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(code == msg.what){
                progress++;//每執行一遍就加1
                pb_main_pb1.setProgress(progress);
                tv_main_tv1.setText(progress + "%");//給百分比設定值
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pb_main_pb1 = this.findViewById(R.id.pb_main_pb1);//獲取進度條控制元件
        tv_main_tv1 = this.findViewById(R.id.tv_main_tv1);
    }


    public void setProgress(View view) {//點選就開始下載
        if(0 == progress){//如果進度為0
            new MyThread().start();//開始執行緒
        }
    }

    private class MyThread extends Thread{//子執行緒
        @Override
        public void run() {//重寫執行緒
            super.run();
            while(true){
                try {
                    Thread.sleep(100);//給執行緒設定睡眠時間0.1s
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(progress == 100){//如果進度為100就終止
                    progress = 0;//恢復預設值0
                    break;//結束終止
                }
                //觸發handleMessage方法
                Message msg = new Message();
                msg.what = 1;//給執行緒做標識
                myHandler.sendMessage(msg);

            }
        }
    }



}

3:執行緒小結 SubThread->MainThread 錯誤 SubThread->Handler->MainThread 正確

上面的為進度條,下面灰色條為按鈕,點選按鈕進度條就會執行