ProgressBar本身进度条组件,它派生了:SeekBar和RatingBar两个组件,他们的继承关系如下:
![](https://box.kancloud.cn/2016-03-10_56e0d9ad706fb.jpg)
**1、ProgressBar有两个进度,**一个是android:progress,另一个是android:secondaryProgress。后者主要是为缓存需要所涉及的,比如在看网络视频时候都会有一个缓存的进度条以及还要一个播放的进度,在这里缓存的进度就可以是android:secondaryProgress,而播放进度就是android:progress,有了secondProgress,可以很方便定制ProgressBar。
**2、ProgressBar分为确定的和不确定的**,确定的是我们能明确看到进度,相反不确定的就是不清楚、不确定一个操作需要多长时间来完成,这个时候就需要用的不确定的ProgressBar了。属性android:indeterminate如果设置为true的话,那么ProgressBar就可能是圆形的滚动条或者水平的滚动条(由样式决定),但是我们一般时候,是直接使用Style类型来区分圆形还是水平ProgressBar的。
进度条的常用xml属性如下:
![](https://box.kancloud.cn/2016-03-10_56e0d9ad80548.jpg)
其中根据**Style属性**的设置不同,可以指定ProgressBar的3种环形进度条和1中水平进度条:
1,大环形进度条 style="?android:attr/progressBarStyleLarge或者style="?android:attr/progressBarStyleLargeInverse"
2,普通环形进度条:style="android:progressBarStyle"
3,小环形进度条:style="?android:attr/progressBarStyleSmall"
4,普通水平进度条:style=“?android:attr/progressBarStyleHorizontal”
**常用属性解释:**
android:max:设置进度条的最大值
android:progress:设置已完成进度条的进度值
android:progressDrawable:设置进度条轨道对应的Drawable对象。可以是一个LayerDrawable对象
android:indeterminate:设置属性是true,设置进度条不精确显示的进度,就是环形进度条的进度值
android:indeterminateDrawable:设置绘制不精确显示的精度的Drawable对象,就是环形进度的轨道Drawable对象;
android:indeterminateDuration;设置不精确显示精度的持续时间
mybar.xml
~~~
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 设置轨道背景 -->
<item android:id="@android:id/background"
android:drawable="@drawable/no"></item>
<!-- 设置轨道上已完成背景的样式 ,在上面-->
<item android:id="@android:id/progress"
android:drawable="@drawable/ok"></item>
</layer-list>
~~~
main.xml
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- 大环形进度条 style="?android:attr/progressBarStyleLarge"-->
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLargeInverse"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- 普通的中等进度条 -->
<ProgressBar
android:id="@+id/progressBar2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- 小环形进度条 style="?android:attr/progressBarStyleSmall"-->
<ProgressBar
android:id="@+id/ProgressBar3"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="任务完成的进度"
android:textSize="20dp" />
<!-- 普通的水平进度条 -->
<ProgressBar
android:id="@+id/progressBar4"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0"
android:visibility="visible" />
<!-- 水平进度条,改变轨道外观 ,外观图片是在drawable里面,xml文件的layer-list元素编写-->
<ProgressBar
android:id="@+id/progressBar5"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:paddingTop="20dp"
android:progressDrawable="@drawable/mybar" />
</LinearLayout>
~~~
MainActivity.java
~~~
package com.hust.progresbartest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
/*给程序模拟填充长度为100的数组*/
private int[] data=new int[100];
int hasData=0;
//记录ProgressBar的完成进度
int status=0;
ProgressBar bar,bar2;
//创建一个负责更新进度的Handler
Handler h=new Handler(){
public void handleMessage(Message msg){
if(msg.what==0x111){
//进度条设置已完成的值
bar.setProgress(status);
bar2.setProgress(status);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bar=(ProgressBar) findViewById(R.id.progressBar4);
bar2=(ProgressBar) findViewById(R.id.progressBar5);
//启动线程来执行任务
new Thread(){
public void run(){
while(status<100){
//获取耗时操作完成百分比
status=dowork();
//发送消息
h.sendEmptyMessage(0x111);
}
}
}.start();
}
//模拟一个耗时的操作
public int dowork(){
//为数组元素赋值
data[hasData++]=(int)(Math.random()*100);
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
return hasData;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
~~~
![](https://box.kancloud.cn/2016-03-10_56e0d9ad92d61.jpg)
- 前言
- Eclipse搭建android环境及Genymotion模拟器安装问题解决方法
- 表格布局(TableLayout)及重要属性
- 帧布局(FrameLayout)及属性
- layout_width和width,layout_height和height
- UI组件之TextView及其子类
- UI组件之TextView及其子类(一)TextView和EditText
- UI组件之TextView及其子类(二)RadioButton和CheckBox
- UI组件之TextView及其子类(三)ToggleButton和Switch
- UI组件之TextView及其子类(四)AnalogClock,DigitalClock
- UI组件之TextView及其子类(五)计时器Chronometer
- UI组件之ImageView及其子类(一)ImageView显示图片
- UI组件之ImageView及其子类(二)ImageButton ,ZoomButton
- UI组件之AdapterView及其子类关系,Adapter接口及其实现类关系
- UI组件之AdapterView及其子类(一)三种Adapter适配器填充ListView
- UI组件之AdapterView及其子类(二)GridView网格视图的使用
- UI组件之AdapterView及其子类(三)Spinner控件详解
- UI组件之AdapterView及其子类(四)Gallery画廊控件使用
- UI组件之AdapterView及其子类(五)ListView组件和ListActivity
- UI组件之AdapterView及其子类(六)ExpandableListView组件和ExpandableListActivity的使用
- UI组件之 ProgressBar及其子类(一)ProgressBar进度条的使用
- UI组件之ProgressBar及其子类(二)SeekBar拖动条和RatingBar星级评分条的使用
- ViewFlipper的功能和用法
- Toast的功能和用法
- TabHost选项卡的 功能和用法
- AlertDialog创建6种对话框的用法
- Android基于监听的事件处理机制
- Android基于回调的事件处理
- Handler消息传递机制(一)
- Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理
- 启动Activity的两种方式startActivity和startActivityForResult(一)
- 启动Activity的两种方式startActivity和startActivityForResult(二)
- Activity的生命周期理解
- Bundle在Activity之间交换数据
- 通过 Intent 传递类对象
- Intent对象详解(一)
- Intent对象详解(二)
- 使用指定的Action,Category调用系统Activity
- 使用Action,Data属性启动系统Activity
- Android数据存储的三种方式-SharedPrefrences,File,SQLite