Android學習筆記14---進度條的實現

ProgressBar進度條

當一個應用在後臺執行時,前臺界面不會有任何信息,這時,用戶根本不知道程序是否在執行以及執行的進度等, 因此需要使用進度條來提示程序執行的進度。

而ProgressBar就是來做這個事情的。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    tools:context="com.amy.processbartest.MainActivity">

    <!--水平進度條 -->
    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        style="@android:style/Widget.ProgressBar.Horizontal" />

    <!-- 圓形進度條 -->
    <ProgressBar
        android:id="@+id/progressBar2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleLarge"/>

</android.support.constraint.ConstraintLayout>

MainActivity.java

package com.amy.processbartest;

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

import static android.R.attr.id;

public class MainActivity extends AppCompatActivity {

    //定義水平進度條
    private ProgressBar horizonP;
    //定義圓形進度條
    private ProgressBar circleP;
    //完成進度
    private int mProcessStatus = 0;
    //聲明一個用於處理消息的Handler類的對象
    private Handler mHandler;

    /**
     * 在主活動onCreate方法中,首先獲得水平進度條和圓形進度條,
     * 然後通過匿名內部類實例化處理消息的Handler類的對象,並重寫其handlerMessage方法,
     * 實現當好吃操作沒有完成時更新進度,否則設置進度條不顯示。
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        horizonP = (ProgressBar) findViewById(R.id.progressBar1);
        circleP = (ProgressBar) findViewById(R.id.progressBar2);
        mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 0x111) {
                    horizonP.setProgress(mProcessStatus);//更新進度
                } else {
                    Toast.makeText(MainActivity.this,"耗時操作已經完成",Toast.LENGTH_SHORT).show();
                    horizonP.setVisibility(View.GONE);
                    circleP.setVisibility(View.GONE);
                }
            }
        };

        //開個線程用語模擬耗時操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    mProcessStatus = doWork();//獲取耗時操作完成的百分比
                    Message msg = new Message();
                    if (mProcessStatus<100) {
                        msg.what = 0x111;
                        mHandler.sendMessage(msg);//發送消息
                    } else {
                        msg.what = 0x110;
                        mHandler.sendMessage(msg);//發送消息
                        break;
                    }
                }
            }
            //模擬一個耗時操作
            private int doWork() {
                mProcessStatus += Math.random()*10;//改變完成進度
                try {
                    Thread.sleep(200);//每隔200毫秒進度改變一次
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return  mProcessStatus;//返回新的進度
            }
        }).start();//開啓一個新的線程

    }
}

效果圖:



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