进度条控件(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); } } }; }效果图如下