一、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的使用方法,可以在实际开发中熟练使用该控件了。