一、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-tw/n/280783.html