一、ProgressBar控件介紹
ProgressBar是Android中常用的控件之一,用於展示進度,可以是不確定的進度條(即循環旋轉),也可以是確定的進度條(即顯示百分比)。它可以用在下載、安裝、上傳等場景下,可以提供進度反饋,提高用戶體驗。
ProgressBar控件可以通過android:indeterminate屬性控制其類型,true表示不確定進度,false表示確定進度(有進度值和進度條)。
下面是ProgressBar的使用示例,其中indeterminate屬性設置為”true”,表示不確定進度:
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true" />
如果設置indeterminate屬性為”false”,則ProgressBar就是確定進度條,下面是一個帶有百分比文字顯示的示例:
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/progress_bar"
android:indeterminate="false"
style="?android:attr/progressBarStyleHorizontal" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
其中,progressDrawable屬性指定了一個Drawable資源,用來定義進度條的樣式。progressBarStyleHorizontal屬性繼承自android:progressBarStyle,表示水平方向的進度條樣式。
二、自定義ProgressBar的樣式
ProgressBar的默認樣式可能與應用的UI風格不匹配,可以通過自定義樣式來實現與應用的統一風格。
自定義ProgressBar樣式,需要使用到progressDrawable資源,它可以是一個層級Drawable或者一個XML文件。層級Drawable是一組Drawable通過layer-list標籤組合在一起,可以實現層次的效果,XML文件則可以使用不同的標籤來定義顏色、大小和形狀等屬性。
下面是一個自定義進度條樣式的示例,使用的是layer-list標籤實現:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#000000" />
</shape>
</item>
<item
android:id="@android:id/progress">
<clip>
<shape
android:shape="rectangle">
<solid android:color="#0000ff" />
</shape>
</clip>
</item>
</layer-list>
以上的代碼定義了一個矩形進度條,進度條包括兩個部分:邊框和進度條。其中item標籤是用來定義Drawable的,第一個item定義了矩形的邊框,stroke屬性用來控制邊框的寬度和顏色,第二個item則是通過clip標籤剪切了矩形形狀,然後填充了指定顏色的矩形,進而形成了一個進度條。
三、ProgressBar控件的常見應用場景
1、下載進度條
在App中,下載是一個常見的操作,需要展現下載進度。可以使用ProgressBar控件來展示下載情況,一般情況下需要實現”進度顯示”和”進度更新”兩個功能。
// 在onCreate()方法中,初始化ProgressDialog控件並設置樣式
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
// 模擬下載任務
new Thread(new Runnable() {
@Override
public void run() {
for(int progress = 0; progress <= 100; progress++) {
try {
Thread.sleep(50);
Message msg = mHandler.obtainMessage();
msg.obj = progress;
mHandler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mProgressDialog.dismiss();
}
}).start();
// 在主線程中更新進度條的進度
private Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
int progress = (int) msg.obj;
mProgressDialog.setProgress(progress);
}
};
以上代碼中,ProgressDialog是ProgressBar的一個子類,它默認提供一個帶有「進度」、「最大值」和「最小值」的滑動進度條。通過調用setProgressStyle()方法可以設置進度條的類型;setCancelable()方法可以設置點擊進度條外部是否取消進度條的操作;show()方法用於顯示進度條;dismiss()方法用於隱藏進度條。
2、加載進度條
加載進度條是一種特殊的ProgressBar,一般用來展示應用正在加載數據或者從網絡上獲取數據時,顯示等待時間。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progressBar"
android:layout_centerInParent="true"
android:indeterminateDrawable="@drawable/progress_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_loading_text"
android:text="加載中..."
android:textSize="20sp"
android:layout_centerHorizontal="true"
android:layout_below="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
在以上代碼中,ProgressBar的indeterminateDrawable屬性指定了一個progress_dialog.xml文件作為加載進度條的樣式,該XML文件可以使用layer-list標籤定製特殊的樣式。TextView用於展示加載進度條下方的文字。
3、上傳進度條
與下載進度條類似,上傳進度條也需要實現”進度顯示”和”進度更新”兩個功能。由於進度顯示上有一些差異,上傳進度條可以在附加一個進度動畫特效,以提高用戶體驗。
// 定義帶有進度特效的Drawable樣式,保存為R.drawable.upload_progress_anim
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/upload_progress_1" android:duration="60" />
<item android:drawable="@drawable/upload_progress_2" android:duration="60" />
<item android:drawable="@drawable/upload_progress_3" android:duration="60" />
<item android:drawable="@drawable/upload_progress_4" android:duration="60" />
<item android:drawable="@drawable/upload_progress_5" android:duration="60" />
<item android:drawable="@drawable/upload_progress_6" android:duration="60" />
<item android:drawable="@drawable/upload_progress_7" android:duration="60" />
<item android:drawable="@drawable/upload_progress_8" android:duration="60" />
</animation-list>
// 初始化ProgressBar控件並設置樣式
mProgressBar.setIndeterminateDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.upload_progress_anim));
// 模擬上傳任務
new Thread(new Runnable() {
@Override
public void run() {
for(int progress = 0; progress <= 100; progress++) {
try {
Thread.sleep(50);
Message msg = mHandler.obtainMessage();
msg.obj = progress;
mHandler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mProgressBar.setIndeterminate(false);
}
}).start();
// 在主線程中更新進度條的進度
private Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
int progress = (int) msg.obj;
mProgressBar.setProgress(progress);
}
};
在以上代碼中,ProgressBar的indeterminateDrawable屬性設置了加載進度條的樣式,該樣式使用animation-list標籤定義了一個帶有進度效果的Drawable資源。checkAnim屬性控制該Drawable循環播放,直到進度完成;在上傳任務結束時,將indeterminate屬性設置為false可以結束進度的播放。
總結
本文詳細講解了Android中的ProgressBar控件,介紹了ProgressBar的分類、自定義樣式和實際應用場景。要點包括:ProgressBar的使用方法、屬性和樣式;ProgressBar在下載、加載、上傳三個場景中的應用方法。讀完本文,相信你已經掌握了ProgressBar的使用方法,可以在實際開發中熟練使用該控件了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/280783.html
微信掃一掃
支付寶掃一掃