解析android中ProgressBar的用法
范例說(shuō)明
Android的Widget,有許多是為了與User交互而特別設(shè)計(jì)的,但也有部分是作為程序提示、顯示程序運(yùn)行狀態(tài)的Widget。現(xiàn)在介紹的范例,與前一章介紹過(guò)的ProgressDialog對(duì)話框的應(yīng)用目的相似,但由于前章介紹的ProgressDialog是繼承自Android.app.ProgressDialog所設(shè)計(jì)的互動(dòng)對(duì)話窗口,在應(yīng)用時(shí),必須新建ProgressDialog對(duì)象,在運(yùn)行時(shí)會(huì)彈出“對(duì)話框”作為提醒,此時(shí)應(yīng)用程序后臺(tái)失去焦點(diǎn),直到進(jìn)程結(jié)束后,才會(huì)將控制權(quán)交給應(yīng)用程序,如果在Activity當(dāng)中不希望后臺(tái)失焦,又希望提示User有某后臺(tái)程序正處于忙碌階段,此時(shí),ProgressBar就會(huì)派上用場(chǎng)了。
Android提供的ProgressBar Widget控件與ProgressDialog應(yīng)用目標(biāo)不同,在程序一開(kāi)始即可在main.xml Layout當(dāng)中布局,先將部署在Layout里的ProgressBar的屬性設(shè)為隱藏(一開(kāi)始看不見(jiàn)),而后使用進(jìn)程來(lái)“假裝”程序忙碌中,但不同的是,可在進(jìn)程當(dāng)中取得運(yùn)行時(shí)的進(jìn)度,在“運(yùn)行”的過(guò)程中,將運(yùn)行進(jìn)度通過(guò)TextView顯示出來(lái)。本范例除了學(xué)習(xí)ProgressBar Widget的顯示及使用之外,另一個(gè)學(xué)習(xí)關(guān)鍵則是Handler的使用,因?yàn)樾缕鸬倪M(jìn)程無(wú)法訪問(wèn)Activity里的Widget,也無(wú)法將運(yùn)行狀態(tài)外送出來(lái),所以需要通過(guò)Handler及Message對(duì)象,將進(jìn)程里的狀態(tài)往外傳遞,最后由Activity的Handler事件接收取得運(yùn)行的狀態(tài)。
范例程序
src/irdc.ex04_17/EX04_17.java
為了讓Thread運(yùn)行過(guò)程中,可以不斷地將信息往Activity傳遞,所以用了Android.os.Handler對(duì)象及Android.os.Message對(duì)象,且在類成員變量中聲明了兩個(gè)整數(shù):GUI_STOP_NOTIFIER與GUI_THREADING_NOTIFIER,這兩個(gè)整數(shù)將作為信息傳遞出來(lái)時(shí)的信號(hào)標(biāo)識(shí),前者為當(dāng)Thread需要喊停的時(shí)候處理,后者為進(jìn)程正在運(yùn)行過(guò)程中所需處理的標(biāo)識(shí)。
程序中設(shè)計(jì)了一個(gè)按鈕,此按鈕的工作是讓原本部署在main.xml里的ProgressBar顯示出來(lái)(原來(lái)是設(shè)置為Android:visibility="gone"),而因?yàn)槟J(rèn)在main.xml中沒(méi)有指定它的indeterm- inate屬性,所以即便在程序中強(qiáng)制調(diào)用了ProgressBar的setIndeterminate()方法,也無(wú)法改變ProgressBar.getProgress()的值,這個(gè)值將永遠(yuǎn)為0。因此,筆者想要使用循環(huán)圖片動(dòng)畫(huà)作為運(yùn)行過(guò)程中的動(dòng)畫(huà),并用了一個(gè)Counter(整數(shù))來(lái)遞增,表示運(yùn)行的百分比。
/* import程序略 */
public class EX04_17 extends Activity
{
private TextView mTextView01;
private Button mButton01;
private ProgressBar mProgressBar01;
public int intCounter=0;
/* 自定義Handler信息代碼,用以作為標(biāo)識(shí)事件處理 */
protected static final int GUI_STOP_NOTIFIER = 0x108;
protected static final int GUI_THREADING_NOTIFIER = 0x109;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton01 = (Button)findViewById(R.id.myButton1);
mTextView01 = (TextView)findViewById(R.id.myTextView1);
/* 設(shè)置ProgressBar widget對(duì)象 */
mProgressBar01 = (ProgressBar)findViewById(R.id.myProgressBar1);
/* 調(diào)用setIndeterminate方法賦值indeterminate模式為false */
mProgressBar01.setIndeterminate(false);
/* 當(dāng)單擊按鈕后,開(kāi)始進(jìn)程工作 */
mButton01.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
/* 單擊按鈕讓ProgressBar顯示 */
mTextView01.setText(R.string.str_progress_start);
/* 將隱藏的ProgressBar顯示出來(lái) */
mProgressBar01.setVisibility(View.VISIBLE);
/* 指定Progress為最多100 */
mProgressBar01.setMax(100);
/* 初始Progress為0 */
mProgressBar01.setProgress(0);
/* 開(kāi)始一個(gè)進(jìn)程 */
new Thread(new Runnable()
{
public void run()
{
/* 默認(rèn)0至9,共運(yùn)行10次的循環(huán)語(yǔ)句 */
for (int i=0;i<10;i++)
{
try
{
/* 成員變量,用以識(shí)別加載進(jìn)度 */
intCounter = (i+1)*20;
/* 每運(yùn)行一次循環(huán),即暫停1秒 */
Thread.sleep(1000);
/* 當(dāng)Thread運(yùn)行5秒后顯示運(yùn)行結(jié)束 */
if(i==4)
{
/* 以Message對(duì)象,傳遞參數(shù)給Handler */
Message m = new Message();
/* 以what屬性指定User自定義 */
m.what = EX04_17.GUI_STOP_NOTIFIER;
EX04_17.this.myMessageHandler.sendMessage(m);
break;
}
else
{
Message m = new Message();
m.what = EX04_17.GUI_THREADING_NOTIFIER;
EX04_17.this.myMessageHandler.sendMessage(m);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}).start();
}
});
}
/* Handler構(gòu)建之后,會(huì)監(jiān)聽(tīng)傳來(lái)的信息代碼 */
Handler myMessageHandler = new Handler()
{
// @Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
/* 當(dāng)取得標(biāo)識(shí)為離開(kāi)進(jìn)程時(shí)所取得的信息 */
case EX04_17.GUI_STOP_NOTIFIER:
/* 顯示運(yùn)行終了 */
mTextView01.setText(R.string.str_progress_done);
/* 設(shè)置ProgressBar Widget為隱藏 */
mProgressBar01.setVisibility(View.GONE);
Thread.currentThread().interrupt();
break;
/* 當(dāng)取得標(biāo)識(shí)為持續(xù)在進(jìn)程當(dāng)中時(shí)所取得的信息 */
case EX04_17.GUI_THREADING_NOTIFIER:
if(!Thread.currentThread().isInterrupted())
{
mProgressBar01.setProgress(intCounter);
/* 將顯示進(jìn)度顯示于TextView當(dāng)中 */
mTextView01.setText
(
getResources().getText(R.string.str_progress_start)+
"("+Integer.toString(intCounter)+"%)/n"+
"Progress:"+
Integer.toString(mProgressBar01.getProgress())+
"/n"+"Indeterminate:"+
Boolean.toString(mProgressBar01.isIndeterminate())
);
}
break;
}
super.handleMessage(msg);
}
};
}
擴(kuò)展學(xué)習(xí)
范例程序中,調(diào)用mProgressBar01.setIndeterminate(false),不顯示背景進(jìn)度Bar,若設(shè)置為mProgressBar01.setIndeterminate(true),也無(wú)法讓默認(rèn)的ProgressBar圖片(轉(zhuǎn)圈圈)有正確的進(jìn)度提示,理由是默認(rèn)的ProgressBar不支持indeterminate mode循環(huán)圖片方式,所以即便setIn- determinate(true)也無(wú)法正確顯示進(jìn)度。在本程序中,為刻意寫(xiě)出作為對(duì)照練習(xí),一般在未知“進(jìn)度”的情況下,可改用文字的方式顯示進(jìn)度百分比,通過(guò)調(diào)用mProgressBar01.getProgress()取得運(yùn)行進(jìn)度值,顯示在文字中。請(qǐng)將Layout里的ProgressBar Widget定義中,加上一個(gè)android: indeterminateOnly屬性,指定其值為false,不顯示后臺(tái)進(jìn)度Bar.
如下所示:
<ProgressBar
android:id="@+id/myProgressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:max="100"
android:progress="0"
android:orientation="horizontal"
android:progressBarStyle=
"@android:style/Widget.ProgressBar.Horizontal"
android:indeterminateOnly="false"
android:visibility="gone"
/>
ProgressBar除了上述關(guān)于Android:progressBarStyle的屬性設(shè)置之外,筆者也調(diào)查了在線Android的源代碼(http://source.android.com),一些原本Android所使用的progressBarStyleHori- zontal屬性,除默認(rèn)“圓形”的圖片之外,還有其他的主題及方形圖片Drawable模式可以使用。
<resources>
<declare-styleable name="Theme">
<!-- snip -->
<attr name="progressBarStyleHorizontal" format="reference" />
</resources>
接下來(lái)看看,這段主題中的屬性名稱progressBarStyleHorizontal定義在frameworks/base/ core/res/res/values/ styles.xml里,如下所示:
<resources>
<style name="Widget.ProgressBar.Horizontal">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">
@android:drawable/progress_horizontal
</item>
<item name="android:indeterminateDrawable">
@android:drawable/progress_indeterminate_horizontal
</item>
<item name="android:minHeight">20dip</item>
<item name="android:maxHeight">20dip</item>
</style>
</resources>
由此可見(jiàn),如果想讓Android使用其他樣式的ProgressBar,可以在原本的Layout(main.xml)里添加以下兩項(xiàng)屬性,以觀察運(yùn)行過(guò)程中的圖片變化。
android:progressDrawable="@android:drawable/progress_horizontal"
android:indeterminateDrawable=
"@android:drawable/progress_indeterminate_horizontal"
- android中ProgressDialog與ProgressBar的使用詳解
- android ListView和ProgressBar(進(jìn)度條控件)的使用方法
- Android編程之ProgressBar圓形進(jìn)度條顏色設(shè)置方法
- Android三種方式實(shí)現(xiàn)ProgressBar自定義圓形進(jìn)度條
- Android ProgressBar進(jìn)度條使用詳解
- Android ProgressBar進(jìn)度條和ProgressDialog進(jìn)度框的展示DEMO
- Android編程實(shí)現(xiàn)自定義ProgressBar樣式示例(背景色及一級(jí)、二級(jí)進(jìn)度條顏色)
- Android之ProgressBar即時(shí)顯示下載進(jìn)度詳解
- Android ProgressBar直線進(jìn)度條的實(shí)例代碼
- Android progressbar實(shí)現(xiàn)帶底部指示器和文字的進(jìn)度條
相關(guān)文章
Android通過(guò)wifi連接手機(jī)(不需要root)
這篇文章主要為大家詳細(xì)介紹了Android通過(guò)wifi連接手機(jī),不需要root,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06解決webview 第二次調(diào)用loadUrl頁(yè)面不刷新的問(wèn)題
這篇文章主要介紹了解決webview 第二次調(diào)用loadUrl頁(yè)面不刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03activity 獲取rootView 設(shè)置backGroundColor的方法
下面小編就為大家?guī)?lái)一篇activity 獲取rootView 設(shè)置backGroundColor的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android項(xiàng)目實(shí)現(xiàn)視頻播放器
這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目實(shí)現(xiàn)視頻播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03Android自定義PopWindow帶動(dòng)畫(huà)向下彈出效果
這篇文章主要為大家詳細(xì)介紹了Android自定義PopWindow帶動(dòng)畫(huà)向下彈出效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Android應(yīng)用開(kāi)發(fā)中觸摸屏手勢(shì)識(shí)別的實(shí)現(xiàn)方法解析
這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)中觸摸屏手勢(shì)識(shí)別的實(shí)現(xiàn)方法解析,深入的部分則是對(duì)左右手勢(shì)的識(shí)別給出了相關(guān)編寫(xiě)思路,需要的朋友可以參考下2016-02-02Android自定義View實(shí)現(xiàn)豎向滑動(dòng)回彈效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)滑動(dòng)回彈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android實(shí)現(xiàn)讀寫(xiě)JSON數(shù)據(jù)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)讀寫(xiě)JSON數(shù)據(jù)的方法,以完整實(shí)例形式分析了Android解析及生成json數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Android異常 java.lang.IllegalStateException解決方法
這篇文章主要介紹了Android異常 java.lang.IllegalStateException解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11