skywang12345

导航

 

Android控件之ProgressBar

1 ProgressBar简介

ProgressBar是进度条,常用于显示程序加载/安装进度等。

2 ProgressBar示例

创建一个activity,包含1个ProgressBar。在Activity中开启一个线程,线程不断的增加ProgressBar的进度;当进度增加满的时候,隐藏ProgressBar。

应用层代码

package com.skywang.control;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.util.Log;

import java.lang.Runnable;

public class ProcessBarTest extends Activity {
    private static final String TAG="SKYWANG";

    // 计数线程
    private CountThread mCountThread;
    // ProcessBar
    private ProgressBar mProgressBar;
    
    // 处理当ProcessBar的进度完成的情况
    private static final int MSG_PROGRESS_BAR_FULL = 1; 
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case MSG_PROGRESS_BAR_FULL: {
                Log.d(TAG, "make the ProgressBar Gone!");
                // 隐藏ProcessBar。
                mProgressBar.setVisibility(View.GONE);
                // 终止线程
                if (mCountThread != null)
                    mCountThread.interrupt();
                    break;
                }
            default:
                break;
            }
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.process_bar_test);

        mProgressBar = (ProgressBar) findViewById(R.id.pbar_def);
        
        // 开启计数线程
        mCountThread = new CountThread();
        mCountThread.start();
    }

    private class CountThread extends Thread {

        @Override
        public void run() {
            super.run();

            while (!isInterrupted()) {
                // 线程休眠200ms
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                int progress = mProgressBar.getProgress() + 2;
                int max = mProgressBar.getMax();

                Log.d(TAG, "progress : "+progress+" , max : "+max);
                if (progress < max)
                    mProgressBar.setProgress(progress);
                else {
                    mProgressBar.setProgress(max);
                    // 发送消息给handler,让它隐藏ProcessBar。
                    handler.sendEmptyMessage(MSG_PROGRESS_BAR_FULL);
                }
            }   
        }
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 终止计数线程
        if (mCountThread != null)
            mCountThread.interrupt();
    }

}

代码说明:

CountThread是ProcessBarTest的内部线程类。
在打开ProcessBarTest时,会自动执行onCreate();然后通过new CountThread()新建线程,再mCountThread.start()启动线程。
线程启动后,每个200ms将进度条的进度值+2;然后进度条已经满格,则调用handler.sendEmptyMessage(MSG_PROGRESS_BAR_FULL)发送消息。MSG_PROGRESS_BAR_FULL消息会被主线程的Handler函数捕获并处理:隐藏“进度条”,然后终止线程。

layout文件

<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"
    android:orientation="vertical" >
    
   <!-- 
    ProgressBar的style可以如下:
    Widget.ProgressBar.Horizontal
    Widget.ProgressBar.Small
    Widget.ProgressBar.Large
    Widget.ProgressBar.Inverse
    Widget.ProgressBar.Small.Inverse
    Widget.ProgressBar.Large.Inverse   
    -->
    <ProgressBar
        android:id="@+id/pbar_def"
        android:layout_width="600px"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:max="100"
        android:progress="10"
    />


</LinearLayout>

style="@android:style/Widget.ProgressBar.Horizontal"
style的值可以为以下任意一个值:
Widget.ProgressBar.Horizontal
Widget.ProgressBar.Small
Widget.ProgressBar.Large
Widget.ProgressBar.Inverse
Widget.ProgressBar.Small.Inverse
Widget.ProgressBar.Large.Inverse


manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.skywang.control"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.skywang.control.ProcessBarTest"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

点击下载:源代码

运行效果:如图

 

posted on 2013-06-15 16:05  如果天空不死  阅读(1753)  评论(0编辑  收藏  举报