Android中的进度条、拖动条及星级评分控件

时间:2021-03-07 08:59:24

进度条控件(ProgressBar)、拖动条控件(SeekBar)、星级评分控件(RatingBar)在Android开发中都是比较常用的控件。

进度条用来显示一个耗时动作的进度,但它并不能自动显示进度的变化需要通过方法来控制。进度条样式大体有两种:水平进度条和圆形进度条(即定时进度条和不定时进度条,也叫确定的进度条和不确定的进度条),默认为圆形进度条。圆形进度条无法显示进度比例,只要其可见就会一直转动,表示正在动作。水平进度条可以显示当前完成度。主要属性如下

style 设置风格,值可以为:@android:style/Widget.ProgressBar.Horizontal水平进度条
      @android:style/Widget.ProgressBar  中号圆形进度条
      @android:style/Widget.ProgressBar.Inverse 中号圆形进度条
      @android:style/Widget.ProgressBar.Small小号圆形进度条
      @android:style/Widget.ProgressBar.Small.Inverse小号圆形进度条
    @android:style/Widget.ProgressBar.Large大号圆形进度条
      @android:style/Widget.ProgressBar.Large.Inverse大号圆形进度条

?android:attr/progressBarStyle
?android:attr/progressBarStyleHorizontal
?android:attr/progressBarStyleInverse
?android:attr/progressBarStyleLarge
?android:attr/progressBarStyleLargeInverse
?android:attr/progressBarStyleSmall
?android:attr/progressBarStyleSmallInverse

其中,带有Inverse参数和不带有Inverse参数的style属性区别在于:当进度条控件所在的界面背景颜色为白色时,需要使用带有Inverse参数的style属性,否则进度条将看不见。

visibility 设置进度条是否可见,值为visibility(可见,默认)、invisibility(不可见但占有控件)、gone(不可见不占位置)

max 代表进度条的最大进度
progress 代表当前进度值
secondaryProgress 代表第二进度值,相当缓存值

以上三个属性仅能在水平进度条中。

可用一下方法控制进度条(水平进度条)

setProgress(int) 设置水平进度条的值
getMax() 获取水平进度条的最大值
incrementProgressBy(int) 设置进度条的进度增加或减少, 当参数为正数时进度增加,为负数时进度减少。

如何控制进度条才能使进度条连续的为我们显示进度呢,肯定要使用线程,但是不能直接在Android主线程中通过sleep()达成效果,查过相关资料后,Android中引入了Handler类可以帮助我们在主线程中建立子线程来完成进度条的功能。

SeekBar和RatinfBar都是ProgressBar的子类。SeekBar(水平拖动条)允许通过拖动滑块调节数值,因此可以作为某些属性的设置按钮,如音量的调节。主要属性如下

thumb 使用自定义图片显示拖动块
style="@android:style/Widget.SeekBar"这是老版本的样式,默认情况下就显示当前版本的样式
max 最大值
progress 当前值
progressDrawable 使用自定义图片显示滑过的部分

可以通过添加SeekBar.OnSeekBarChangeListener监听器,监控其进度值变化。

RatingBar(星级评分)常出现在评分项目中,显示的样式为几个五角星,选中后五角星会被填充。主要属性如下

android:numStarts 设置五角星的数量,必须为整数
android:rating 设置星级评分条默认的星级,可以为小数
android:stepSize 步长,设置每次至少需要改变多少个星级,可以为小数

可以通过添加RatingBar.setOnRatingBarChangeListener监听器监控其分数的变化。

布局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:padding="10dp"
    android:background="#7e99ff"
    android:orientation="vertical" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="水平进度条"/>
    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="1"
        android:secondaryProgress="100"
        android:background="#ffffff"
        android:visibility="visible"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="圆形进度条" />
    <ProgressBar
        android:id="@+id/progressBar2"
        style="?android:attr/progressBarStyleLarge"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="星级评分" />
    <RatingBar
        android:id="@+id/ratingBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:numStars="5"
        android:rating="2.5"
        android:stepSize="0.5" />
    <TextView
        android:id="@+id/tv_Seek"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="水平拖动条" />
    <TextView
        android:id="@+id/tv_SeekBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:layout_gravity="center_horizontal"
        android:text="0" />
    <SeekBar
        android:id="@+id/seekBar"
        style="@android:style/Widget.SeekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"/>
    <Button 
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始"/>
    <Button 
        android:id="@+id/btn_end"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="终止"/>
</LinearLayout>
MainActivity.class代码如下

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.RatingBar.OnRatingBarChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	ProgressBar pbOne,pbTwo;
	RatingBar rb;
	SeekBar sb;
	TextView tvSeek,tvSeekBar;
	Button btnStart,btnEnd;
	Handler handler;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		pbOne = (ProgressBar) findViewById(R.id.progressBar1);
		pbTwo = (ProgressBar) findViewById(R.id.progressBar2);
		rb = (RatingBar) findViewById(R.id.ratingBar);
		sb = (SeekBar) findViewById(R.id.seekBar);
		tvSeek = (TextView) findViewById(R.id.tv_Seek);
		tvSeekBar = (TextView) findViewById(R.id.tv_SeekBar);
		btnStart = (Button) findViewById(R.id.btn_start);
		btnEnd = (Button) findViewById(R.id.btn_end);
		handler = new Handler();
		
		rb.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
			@Override
			public void onRatingChanged(RatingBar ratingBar, float rating,
					boolean fromUser) {
				Toast.makeText(MainActivity.this, "评级为"+rating+"星", Toast.LENGTH_LONG).show();
			}
		});
		sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				tvSeek.setText("水平拖动条:修改完成");
			}
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				tvSeek.setText("水平拖动条:修改中");
			}
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				tvSeekBar.setText(progress+"");
			}
		});
		btnStart.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				handler.post(progress);
				Toast.makeText(MainActivity.this, "开始进度", Toast.LENGTH_LONG).show();
			}
		});
		btnEnd.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				handler.removeCallbacks(progress);
				pbOne.setProgress(0);
				pbTwo.setVisibility(View.INVISIBLE);
				Toast.makeText(MainActivity.this, "终止进度", Toast.LENGTH_LONG).show();
			}
		});
	}
	Runnable progress = new Runnable(){
		@Override
		public void run() {
			pbTwo.setVisibility(View.VISIBLE);//圆形进度条显示
			pbOne.setProgress(pbOne.getProgress()+10);//设置进度条增加
				if(pbOne.getProgress()<pbOne.getMax()){
					handler.postDelayed(progress, 500);//延迟半秒开始进程
				}else{
					handler.removeCallbacks(progress);
					pbOne.setProgress(0);
					pbTwo.setVisibility(View.INVISIBLE);
				}
		}
	};
}
效果图如下

Android中的进度条、拖动条及星级评分控件Android中的进度条、拖动条及星级评分控件

Android中的进度条、拖动条及星级评分控件Android中的进度条、拖动条及星级评分控件