进度条组件包含进度条(ProgressBar),拖动条(SeekBar)和星级评分条(RatingBar)。
图1 进度条组件继承关系图
1 进度条
Android提供两种进度条:水平进度条和圆形进度条。
xml布局文件<ProgressBar>基本语法如下:
<ProgressBar
属性列表
>
</ProgressBar>
ProgressBar支持的xml属性如表2:
xml属性 | 描述 |
android:max | 设置进度条的最大值 |
android:progress | 指定进度条已完成的进度值 |
android:progressDrawable | 设置进度条轨道的绘制形式 |
表2 ProgressBar支持的xml属性
ProgressBar的style支持的xml属性如表2:
xml属性 | 描述 |
?android:attr/progressBarStyleHorizontal | 细水平长条进度条 |
?android:attr/progressBarStyleLarge | 大圆形进度条 |
?android:attr/progressBarStyleSmall | 小圆形进度条 |
@android:style/Widget.ProgressBar.Large | 大跳跃,旋转画面的进度条 |
@android:style/Widget.ProgressBar.Small | 小跳跃,旋转画面的进度条 |
@android:style/Widget.ProgressBar.Horizontal | 粗水平长条进度条 |
表3 ProgressBar的style支持的xml属性
操作进度的接口:
(1)setProgress(int progress)
设置进度完成百分比
(2)incrementProgressBy(int diff)
设置进度条增加(diff>0)或减少(diff<0)
ProgressBar:实现水平进度条
MainActivity.java
public class MainActivity extends Activity {
public final static String TAG = "ProgressBar";
final int TIME = 20; //定义时间长度
final int TIMER_MSG = 0x001; //定义消息代码
private ProgressBar timer; //声明水平进度条
private int mProgressStatus = 0; //定义完成进度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = (ProgressBar) findViewById(R.id.timer); //获取进度条组件
handler.sendEmptyMessage(TIMER_MSG); //发送消息,启动进度条
Log.d(TAG, "onCreate tid:" + android.os.Process.myTid());
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//当前进度大于0
if (TIME - mProgressStatus > 0) {
mProgressStatus++; //进度+1
Log.d(TAG, "handleMessage mProgressStatus:" + mProgressStatus);
Log.d(TAG, "handleMessage tid:" + android.os.Process.myTid());
timer.setProgress(TIME - mProgressStatus); //更新进度条的显示进度
handler.sendEmptyMessageDelayed(TIMER_MSG, 1000); //延迟一秒发送消息
} else {
Toast.makeText(MainActivity.this, "时间到!", Toast.LENGTH_SHORT).show(); //提示时间已到
Log.d(TAG, "handleMessage timeout!");
}
}
};
}
https://github.com/hanyuhang-hz/android-demos
2 拖动条
xml布局文件<SeekBar>基本语法如下:
<SeekBar
属性列表
>
</SeekBar>
android:thumb属性用来改变拖动滑块的外观。
拖动条需要添加OnSeekBarChangeListener监听器。
SeekBar:实现透明度拖动条
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ImageView image;
private SeekBar seekBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image);
seekBar = (SeekBar) findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
// 当拖动条的滑块位置发生改变时触发该方法
@Override
public void onProgressChanged(SeekBar arg0, int progress, boolean fromUser) {
// 动态改变图片的透明度
image.setImageAlpha(progress);
}
@Override
public void onStartTrackingTouch(SeekBar bar) {
}
@Override
public void onStopTrackingTouch(SeekBar bar) {
}
});
}
}
https://github.com/hanyuhang-hz/android-demos
3 星级评分条
xml布局文件<RatingBar>基本语法如下:
<RatingBar
属性列表
>
</RatingBar>
RatingBar组件支持的xml属性如表4:
xml属性 | 描述 |
android:isIndicator | 指定该星级评分条是否允许用户改变,true表示不允许改变 |
android:numStars | 指定星级评分条共多少颗星 |
android:rating | 指定星级评分条默认的星级 |
android:stepSize | 指定每次最少需要改变的星级个数,默认0.5个 |
表4 RatingBar组件支持的xml属性
RatingBar:实现星级评分条
MainActivity.java:
public class MainActivity extends Activity {
private RatingBar ratingbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ratingbar = (RatingBar) findViewById(R.id.ratingBar1);
Button button=(Button)findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int result = ratingbar.getProgress(); // 获取进度
float rating = ratingbar.getRating(); // 获取等级
float step = ratingbar.getStepSize(); // 获取每次最少要改变多少个星级
Log.i("星级评分条","step="+step+" result="+result+" rating="+rating);
Toast.makeText(MainActivity.this, "你得到了" + rating + "颗星", Toast.LENGTH_SHORT).show();
}
});
}
}