ProgressBar时android用于显示进度的组件。当执行一个比较耗时的操作(如io操作、网络操作等),为了避免界面没有变化让用户体验降低,提供一个进度条可以让用户知道程序还在运行。

一、ProgressBar有如下几种常见样式

1、默认进度条的样式为圆圈(为中等大小的圆圈)

<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

注意,当样式为圆圈时,其进度不停的在旋转,只是告诉用互程序在执行,无法精确地告诉用户具体进度。

而且默认显示就是旋转的,还无法让它停下来,只有通过程序让其隐藏(比如任务处理完成时)。

如果想要显示为圆形的,又要控制其停顿和旋转,需要用自定义的方式,这个不在这里介绍。

隐藏进度条,很简单:xxxx.setVisibility(View.GONE);

2、显示为大的尺寸的圆圈

<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

3、显示为小的尺寸的圆圈

<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

可以直接设置 layout_width 和 layout_height为具体的值,来控制圆圈的半径。

4、显示为直条形的

<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

对于直条形的样式,不仅可以让它向圆形一样,默认就是进度不停变化;而且还可以精确控制其进度,下面会重点介绍。

二 、直条形进度条

设置为一直在旋转的样式

<ProgressBar
android:id="@+id/progress1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
/>

设置indeterminate属性为true,就可以显示时进度条一直在变化,该属性默认是false的。

如果想让它停止变化,可以通过代码控制:

ProgressBar pro1 = (ProgressBar) findViewById(R.id.progress1);

pro1.setIndeterminate(false);

如果想让它停止时,进度显示完成,可以如下代码:

pro1.setProgress(100);

注意进度条的默认最大大小是100,可以通过setMax来设置自己需要的值。

三、精确控制进度(和AsyncTask结合)

代码如下

	public void startProgress(View view) {
final ProgressBar pro1 = (ProgressBar) findViewById(R.id.progress1);
new AsyncTask<Integer, Integer, Integer>() {
@Override
protected Integer doInBackground(Integer... params) {
for (int i = 1; i <= 100; i++)
doSomethingTask(i);
return 100;
} private void doSomethingTask(int num) {
try {
Thread.sleep(50);
publishProgress(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Override
protected void onPostExecute(Integer result) {
TextView resultView = (TextView) findViewById(R.id.resultText);
resultView.setVisibility(View.VISIBLE);
resultView.setText("the result is " + result);
super.onPostExecute(result);
} @Override
protected void onProgressUpdate(Integer... values) {
pro1.setProgress(values[0]);
super.onProgressUpdate(values);
} }.execute(1);
}

在AsyncTask的doInBackground方法中执行后台任务(实际上是在另外线程中执行,如io操作、网络操作。在这个方法中不能操作界面组件),如果想让进度条显示中间的进度,就可以在后台任务的执行过程中调用publishProgress方法发送进度。而执行publishProgress方法,会触发onProgressUpdate方法(该方法在主线程中进行,可以在该方法中更新界面组件,这里更新的是进度条的进度)。当doInBackground方法执行完毕后,会触发onPostExecute方法(该方法在主线程中进行,可以在该方法中更新界面组件),可以在该方法中显示任务完成后的界面,上面例子是在本文view显示下信息。

通过上面的代码和例子,基本上就可以满足大部分场景。最后提一点的是,ProgressBar的进度只能通过代码控制,无法让用户拖动。如果想要让用户能够拖动进度(比如在视频或音频播放界面),可以使用SeekBar组件。

Android学习笔记:进度条ProgressBar的使用以及与AsyncTask的配合使用的更多相关文章

  1. Android学习笔记_81_Android ProgressDialog ProgressBar 各种效果

    1,弹出Dialog 屏幕不变暗. 创建一个样式就OK了:在styles.xml文件里添加样式: 1, <style name="dialog" parent="@ ...

  2. Android 自学之进度条ProgressBar

    进度条(ProgressBar)也是UI界面中的一种非常使用的组件,通常用于向用户显示某个耗时完成的百分比.因此进度条可以动态的显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应, ...

  3. Python学习笔记-进度条

    该功能用以输出任务百分比 #conding=utf-8 import sys #进度条函数,输入当前任务以及总任务数 def ProgressBar(Current,Total): processpe ...

  4. Android学习笔记- ProgressBar(进度条)

    本节引言: 本节给大家带来的是Android基本UI控件中的ProgressBar(进度条),ProgressBar的应用场景很多,比如 用户登录时,后台在发请求,以及等待服务器返回信息,这个时候会用 ...

  5. Android学习笔记(24):进度条组件ProgressBar及其子类

    ProgressBar作为进度条组件使用,它还派生了SeekBar(拖动条)和RatingBar(星级评分条). ProgressBar支持的XML属性: Attribute Name Related ...

  6. Android零基础入门第51节:进度条ProgressBar

    原文:Android零基础入门第51节:进度条ProgressBar 不知不觉这已经是第51期了,在前面50期我们学了Android开发中使用频率非常高的一些UI组件,当然这些组件还不足够完成所有AP ...

  7. android学习笔记七——控件(DatePicker、TimePicker、ProgressBar)

    DatePicker.TimePicker ==> DatePicker,用于选择日期 TimePicker,用于选择时间 两者均派生与FrameLayout,两者在FrameLayout的基础 ...

  8. Android(java)学习笔记130:ProgressBar使用的

    首先我们看例程如下: 1.main.xml文件如下: <?xml version="1.0" encoding="utf-8"?> <Line ...

  9. android圆形进度条ProgressBar颜色设置

    花样android Progressbar http://www.eoeandroid.com/thread-1081-1-1.html http://www.cnblogs.com/xirihanl ...

随机推荐

  1. 10个JavaScript小技巧

    1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法.始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做 ...

  2. 通过JavaScript判断当前浏览器版本

    从别人处拷贝,只用于自己学习之用.参考源自:http://www.cnblogs.com/leadzen/archive/2008/09/06/1285764.html JavaScript是前端开发 ...

  3. c#中使用log4net工具记录日志

    首先,去官网下载log4net工具 链接http://logging.apache.org/log4net/download_log4net.cgi 目前最新的版本 log4net-1.2.15-bi ...

  4. floyed算法

    Floyed算法(实际是动态规划问题) 问题:权值矩阵matrix[i][j]表示i到j的距离,如果没有路径则为无穷 求出权值矩阵中任意两点间的最短距离 分析:对于每一对定点u,v看是否存在一个点w使 ...

  5. BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )

    取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...

  6. 在VS2010上使用C#调用非托管C++生成的DLL文件

    背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用.本篇文章将引导你快速理解这个调用 ...

  7. webviewactivity

    WebView注意点,注释里有说明 package com.example.suneyaenews; import com.example.http.HttpThread; import androi ...

  8. .NET参数化Oracle查询参数

    最近在做数据库移植工作(SqlServer 2008 -> Oracle 11g),遇到一些不兼容的问题,以下是一个参数化方面的区别,资料来自其他网友,在此整理了一下. public stati ...

  9. 条码知识之十:EAN-128条码(下)

    国际物品编码协会(EAN)和美国统一代码委员会(UCC)将CODE-128码引入EAN/UCC系统,并作如下规定:起始符由一个START A/B/C 加一个辅助字符FNC1构成,以区别普通的CODE- ...

  10. mysql merge table

    SELECT COUNT(*) FROM `comment` SHOW CREATE TABLE `comment` CREATE TABLE `comment1` ( `id` INT(8) NOT ...