一、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/n/280783.html
微信扫一扫
支付宝扫一扫