1.進度條(ProgressBar)的功能與用法
ProgressBar組件本身代表了進度條組件,它還派生了兩個常用組件:SeekBar和RatingBar.
進度條通常用於向用戶顯示某個耗時操作完成的百分比,通過style屬性可以爲ProgressBar指定風格(水平進度條、環形進度條等)
Xml屬性中,android:progressDrawable用於指定進度條的軌道的繪製形式,該屬性可指定一個LayoutDrawable對象(該對象可通過在Xml文件中用<layer-list>元素進行配置)
實例:
界面佈局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<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>
Ps:上面定義了三個環形進度條,這些進度條無法顯示進度,只顯示一個不斷旋轉的圖片。佈局文件定義兩個水平進度條的最大值爲100,第二個外觀被定義爲@drawable/my_bar 代碼爲:
<?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>
<!-- 定義軌道上已完成部分的樣式 -->
<item android:id="@android:id/progress"
android:drawable="@drawable/ok"/>
</layer-list>
Activity代碼清單,用一個填充數組的任務模擬了耗時操作,並以進度條來標識任務的完成百分比:
public class ProgressBarT extends Activity {
//該程序模擬填充長度爲100的數據
private int[] data = new int[100];
int hasDate = 0;
//記錄ProgressBar的完成進度
int status = 0;
ProgressBar bar, bar2;
//創建一個負責更新的進度的Handler
Handler mHandler = new Handler()
{
public voidhandleMessage(Message msg)
{
//表明信息是由該程序發送的
if (msg.what == 0x111)
{
bar.setProgress(status);
bar2.setProgress(status);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progress_bar_t);
bar = (ProgressBar) findViewById(R.id.bar);
bar2 = (ProgressBar) findViewById(R.id.bar2);
//啓動線程來執行任務
new Thread()
{
public void run()
{
while (status < 100)
{
//獲取耗時操作的完成百分比
status = doWork();
//發送消息
mHandler.sendEmptyMessage(0x111);
}
}
}.start();
}
//模擬一個耗時操作
public int doWork()
{
//爲數組元素賦值
data[hasDate++] = (int) (Math.random()*100);
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return hasDate;
}
}
效果:
實例2:顯示在標題上的進度條
這種進度條直接由Activity的方法啓用爲在窗口上顯示進度條,需經如下兩部:
1. 調用Activity的requestWindowFeature()方法,該方法根據傳入的參數可啓用特定的窗口特徵。
2. 調用Activity的setProgressBarIndeterminateVisibility(boolean)或
setProgressBarVisibility(boolean)方法即可控制進度條的顯示和隱藏。
Activity代碼清單
public class TitleProgressBarT extends Activity {
Button bn1, bn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//設置窗口特徵:啓動顯示進度的進度條
requestWindowFeature(Window.FEATURE_PROGRESS);
//設置窗口特徵:啓用不顯示進度的進度條
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.title_progress_bar_t);
bn1 = (Button) findViewById(R.id.bn1);
bn2 = (Button) findViewById(R.id.bn2);
bn1.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
//顯示不帶進度的進度條
setProgressBarIndeterminateVisibility(true);
//顯示帶進度的進度條
setProgressBarVisibility(true);
//設置進度條的進度
setProgress(4500);
}
});
bn2.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
//顯示不帶進度的進度條
setProgressBarIndeterminateVisibility(false);
//顯示帶進度的進度條
setProgressBarVisibility(false);
}
});
}
}
效果:
2.拖動條(SeekBar)的功能和用法
拖動條與進度條非常相似,只是拖動條通過滑塊位置來表示數值—而且拖動條允許用戶拖動滑塊來改變值。
改變滑塊外觀可通過如下屬性android:thumb:指定一個Drawable對象,該對象將作爲自定義滑塊。
爲了讓程序響應拖動條滑塊位置變化,程序可以考慮爲它綁定一個OnSeekBarChangeListener監聽器。
實例:
線性佈局一個圖片組件、一個拖動條
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="240px"
android:src="@drawable/p1"/>
<!-- 定義一個拖動條,並改變它的滑塊外觀 -->
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="255"
android:progress="255"
android:thumb="@drawable/ic_launcher"/>
PS:該拖動條的最大值、當前值都是255,android:thumb屬性是改變拖動條滑塊的外觀。
Activity中綁定一個監聽器,動態改變圖片透明度:
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
//當滑動條的滑塊位置發生改變時觸發該方法
@Override
public void onProgressChanged(SeekBar arg0, int progress,
boolean fromUser) {
//動態改變圖片的透明度
image.setAlpha(progress);
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
});
效果:
3.星級評分條(RatingBar)功能用法
星級條與拖動條有相同父類AbsSeekBar,很相近。
爲讓程序響應星級評分條的改變,程序可以考慮爲它綁定一個onRatingChanged監聽器。
實例:
界面佈局RatingBar代碼段
<RatingBar
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:max="255"
android:progress="255"
android:stepSize="0.5"
/>
主程序爲RatingBar綁定事件監聽器
rating.setOnRatingBarChangeListener(new OnRatingBarChangeListener()
{
@Override
public void onRatingChanged(RatingBarratingBar, float rating,
boolean fromUser) {
// 動態改變圖片透明度,其中255是星級評分條最大值
//5個星星就是代表最大值255
image.setAlpha((int) (rating * 255) / 5);
}
});
效果:
PS:程序報錯“不能引用另一方法中定義的內部類中非終態變量 image”
原因:因爲內部類本身是方法內的臨時變量,只存在於方法內。
所以需將image改爲“final image”或在方法外定義。