ProgressBar本身代表了进度条组件,它还派生了两个常用组件:SeekBar和RatingBar。
它和其子类在用法上十分相似,只是显示界面上有区别
2.6.1 ProgressBar的功能与用法
Android支持几种风格的进度条,通过style属性可以为ProgressBar指定风格。其支持的属性有:
@android:syle/Widget.ProgressBar.Horizontal
|
水平进度条
|
@android:syle/Widget.ProgressBar.Inverse
|
普通大小的环形进度条
|
@android:syle/Widget.ProgressBar.Large
|
大环形进度条
|
@android:syle/Widget.ProgressBar.Large.Inverse
|
大环形进度条
|
@android:syle/Widget.ProgressBar.Small
|
小环形进度条
|
@android:syle/Widget.ProgressBar.Small.Inverse
|
小环形进度条
|
除此之外,ProgressBar还支持如下常用XML属性:
android:max
|
设置该进度条的最大值
|
android:progress
|
设置该进度条的已完成进度
|
android:progressDrawable
|
设置该进度条的轨道对应的Drawable对象
|
android:indeterminate
|
若设为true,则进度条为不精确显示进度
|
android:indeterminateDrawable
|
设置绘制不显示进度条的Drawable对象
|
android:indeterminateDuration
|
设置不精确显示进度条的持续时间
|
android:progressDrawable用于指定进度条的轨道绘制形式,该属性可指定为一个LayerDrawable对象的引用(该对象可通过在XML文件中用<layer-list元素进行配置>)
setProgress(int) |
设置进度的完成百分比
|
incrementProgressBy(int)
|
设置进度条的进度增加或减少(正负以区分)
|
示例代码:
public
class
MainActivity
extends
Activity {
private int [] data = new int [100];
int hasData = 0;
int status = 0;
ProgressBar bar , bar2 ;
Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if (msg. what == 0x11)
{
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. bar );
bar2 = (ProgressBar) findViewById(R.id. bar2 );
//thread to process
new Thread()
{
public void run()
{
while ( status < 100)
{
status = doWork();
mHandler .sendEmptyMessage(0x111);
}
}
}.start();
}
public int doWork()
{
data [ hasData ++] = ( int ) (Math.random() * 100);
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return hasData ;
private int [] data = new int [100];
int hasData = 0;
int status = 0;
ProgressBar bar , bar2 ;
Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if (msg. what == 0x11)
{
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. bar );
bar2 = (ProgressBar) findViewById(R.id. bar2 );
//thread to process
new Thread()
{
public void run()
{
while ( status < 100)
{
status = doWork();
mHandler .sendEmptyMessage(0x111);
}
}
}.start();
}
public int doWork()
{
data [ hasData ++] = ( int ) (Math.random() * 100);
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return hasData ;
}
}
main.xml代码:
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical"
>
< LinearLayout
android:orientation = "horizontal"
android:layout_width = "match_parent"
android:layout_height = "wrap_content" >
< ProgressBar
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
style = "@android:style/Widget.ProgressBar.Large" />
< ProgressBar
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
< ProgressBar
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
style = "@android:style/Widget.ProgressBar.Small" />
</ LinearLayout >
< TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Progress of completion." />
< ProgressBar
android:id = "@+id/bar"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:max = "100"
style = "@android:style/Widget.ProgressBar.Horizontal" />
< ProgressBar
android:id = "@+id/bar2"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:max = "100"
android:progressDrawable = "@drawable/my_bar"
style = "@android:style/Widget.ProgressBar.Horizontal" />
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical"
>
< LinearLayout
android:orientation = "horizontal"
android:layout_width = "match_parent"
android:layout_height = "wrap_content" >
< ProgressBar
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
style = "@android:style/Widget.ProgressBar.Large" />
< ProgressBar
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
< ProgressBar
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
style = "@android:style/Widget.ProgressBar.Small" />
</ LinearLayout >
< TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Progress of completion." />
< ProgressBar
android:id = "@+id/bar"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:max = "100"
style = "@android:style/Widget.ProgressBar.Horizontal" />
< ProgressBar
android:id = "@+id/bar2"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:max = "100"
android:progressDrawable = "@drawable/my_bar"
style = "@android:style/Widget.ProgressBar.Horizontal" />
</
LinearLayout
>
my_bar.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 android:id = "@android:id/progress"
android:drawable = "@drawable/ok" />
< layer-list xmlns:android = "http://schemas.android.com/apk/res/android" >
< item android:id = "@android:id/background"
android:drawable = "@drawable/no" />
< item android:id = "@android:id/progress"
android:drawable = "@drawable/ok" />
</
layer-list
>
还有一种进度条,可以直接在标题上显示进度,这种进度条甚至不需要ProgressBar,它直接由Activity启用,使用步骤如下:
1.调用Activity的requestWindowFeature()方法
2.setProgressBarVisibility(boolean)或者setProgressBarIndeterminateVisibility(boolean)方法控制显示和隐藏
示例代码如下:
public
class
MainActivity
extends
ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
//progress bar on title
requestWindowFeature(Window. FEATURE_PROGRESS );
requestWindowFeature(Window. FEATURE_INDETERMINATE_PROGRESS );
setContentView(R.layout. activity_main );
Button bn1 = (Button) findViewById(R.id. bn1 );
Button bn2 = (Button) findViewById(R.id. bn2 );
bn1.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
setProgressBarIndeterminateVisibility( true );
setProgressBarVisibility( true );
setProgress(4500);
}
});
bn2.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
setProgressBarIndeterminateVisibility( false );
setProgressBarVisibility( false );
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
//progress bar on title
requestWindowFeature(Window. FEATURE_PROGRESS );
requestWindowFeature(Window. FEATURE_INDETERMINATE_PROGRESS );
setContentView(R.layout. activity_main );
Button bn1 = (Button) findViewById(R.id. bn1 );
Button bn2 = (Button) findViewById(R.id. bn2 );
bn1.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
setProgressBarIndeterminateVisibility( true );
setProgressBarVisibility( true );
setProgress(4500);
}
});
bn2.setOnClickListener( new OnClickListener()
{
@Override
public void onClick(View source)
{
setProgressBarIndeterminateVisibility( false );
setProgressBarVisibility( false );
}
});
}
}
2.6.2 SeekBar的功能和用法 (拖动条)
SeekBar继承了ProgressBar,故ProgressBar所支持的XML属性和方法适用于SeekBar
SeekBar允许用户改变拖动条的滑块外观,改变滑块外观通过如下属性来指定:
android:thumb 指定一个Drawable对象,作为自定义滑块
2.6.3 RatingBar的功能和用法(
星级评分条
)
星级评分条与拖动条有相同的父类:AbsSeekBar
唉3是android:isIndicator
|
设置该星级评分条是否允许用户改变(true为不允许修改)
|
android:numStars
| 共有多少星级 |
android:rating
| 默认评分星级 |
android:stepSize
|
每次需要改变多少个星级
|
为了让程序响应星级评分条的改变,程序可为其绑定一个OnRatingBarChangeListenter监听器
示例代码:
public
class
MainActivity
extends
ActionBarActivity {
RatingBar ratingBar ;
ImageView image ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
ratingBar = (RatingBar) findViewById(R.id. rating );
image = (ImageView) findViewById(R.id. iamge );
ratingBar .setOnRatingBarChangeListener( new OnRatingBarChangeListener()
{
@Override
public void onRatingChanged(RatingBar arg0, float rating, boolean fromUser)
{
image .setAlpha((
int
)(rating * 255/5));
}
});
RatingBar ratingBar ;
ImageView image ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_main );
ratingBar = (RatingBar) findViewById(R.id. rating );
image = (ImageView) findViewById(R.id. iamge );
ratingBar .setOnRatingBarChangeListener( new OnRatingBarChangeListener()
{
@Override
public void onRatingChanged(RatingBar arg0, float rating, boolean fromUser)
{
image .
}
});
}
xml代码:
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical" >
< ImageView
android:id = "@+id/iamge"
android:layout_width = "match_parent"
android:layout_height = "240px"
android:src = "@drawable/lijiang"
/>
< RatingBar
android:id = "@+id/rating"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:numStars = "5"
android:max = "255"
android:progress = "255"
android:stepSize = "0.5"
/>
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical" >
< ImageView
android:id = "@+id/iamge"
android:layout_width = "match_parent"
android:layout_height = "240px"
android:src = "@drawable/lijiang"
/>
< RatingBar
android:id = "@+id/rating"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:numStars = "5"
android:max = "255"
android:progress = "255"
android:stepSize = "0.5"
/>
</
LinearLayout
>