Android控件详解之进度控件

我将Android控件的进度控件的学习知识总结一下和大家共享包括(ProgressBar、SeekBar、RatingBar)

在Android开发中,任务或者工作进度就是需要用到进度控件,Android源生提供了progressbar、seekbar、ratingbar这三种进度控件。

1、ProgressBar控件

ProgressBar控件在默认的情况下是圆形的进度条,可通过style属性将圆形进度条设为大、中、小3种形式(引用系统style资源用?)

style="?android:attr/progressBarStyleSmallTitle"  //小的形式
//默认是中的大小形式,不设置即可
<pre name="code" class="html">style="?android:attr/progressBarStyleLargeTitle"  //大的形式 

 ProgressBar还提供支持水平进度条 

style="?android:attr/progressBarStyleHorizontal" android:max="100"
		android:progress="30" android:secondaryProgress="60"
水平进度条支持两级进度android:progress和android: secondaryProgress属性设置。android:max为最大刻度值。

另外Android系统还支持将水平和圆形进度条放在窗口的标题栏上,

requestWindowFeature(Window.FEATURE_PROGRESS);
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		setContentView(R.layout.main);
		setProgressBarVisibility(true);     //  显示水平进度条
		setProgressBarIndeterminateVisibility(true);    //    显示圆形进度条
		setProgress(3500);<span style="white-space:pre">	</span>//显示水平进度条当前的进度
注意: requestWindowFeature方法应在调用 setContentView方法之前,否则系统会抛出异常。 setProgressBarVisibility、 setProgressBarIndeterminateVisibility、 setProgress

方法必须在setContentView方法之后,否则会无效。标题栏上默认最大刻度是10000。

下面是一个实例:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="圆形进度条(小)" />
	<ProgressBar android:layout_width="wrap_content"
		android:layout_height="wrap_content" style="?android:attr/progressBarStyleSmallTitle" />
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="圆形进度条(中)" />
	<ProgressBar android:layout_width="wrap_content"
		android:layout_height="wrap_content" />
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="圆形进度条(大)" />
	<ProgressBar android:layout_width="wrap_content"
		android:layout_height="wrap_content" style="?android:attr/progressBarStyleLarge" />
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="水平进度条" />
	<ProgressBar android:layout_width="fill_parent"
		android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal"
		android:max="100" android:progress="30" />
	<ProgressBar android:id="@+id/progressBarHorizontal"
		android:layout_width="fill_parent" android:layout_height="wrap_content"
		style="?android:attr/progressBarStyleHorizontal" android:max="100"
		android:progress="30" android:secondaryProgress="60"
		android:layout_marginTop="20dp" />
	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" android:layout_width="fill_parent"
		android:layout_height="fill_parent">
		<Button android:id="@+id/button1" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:layout_marginTop="20dp"
			android:text="增加进度" />
		<Button android:id="@+id/button2" android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:layout_marginTop="20dp"
			android:text="减小进度" />
	</LinearLayout>
</LinearLayout>
java代码文件:

public class Main extends Activity implements OnClickListener
{
	private ProgressBar progressBarHorizontal;

	@Override
	public void onClick(View view)
	{
		switch (view.getId())
		{
			// 处理“增加进度"按钮事件
			case R.id.button1:
				progressBarHorizontal.setProgress((int) (progressBarHorizontal
						.getProgress() * 1.2));
				progressBarHorizontal
						.setSecondaryProgress((int) (progressBarHorizontal
								.getSecondaryProgress() * 1.2));
				break;
			// 处理“减少进度"按钮事件
			case R.id.button2:
				progressBarHorizontal.setProgress((int) (progressBarHorizontal
						.getProgress() * 0.8));
				progressBarHorizontal
						.setSecondaryProgress((int) (progressBarHorizontal
								.getSecondaryProgress() * 0.8));
				break;
		}

	}

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_PROGRESS);
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		setContentView(R.layout.main);
		setProgressBarVisibility(true);
		setProgressBarIndeterminateVisibility(true);
		setProgress(3500);
		progressBarHorizontal = (ProgressBar) findViewById(R.id.progressBarHorizontal);
		Button button1 = (Button) findViewById(R.id.button1);
		Button button2 = (Button) findViewById(R.id.button2);
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
	}
}
2、SeekBar控件

SeekBar控件是可以通过拖动滑杆改变当前的值,SeekBar其实是ProgressBar的子类,但是它一般不设置第2进度。

与SeekBar控件滑动相关事件接口是OnSeekBarChangeListener,该接口定义了如下3个事件:

public void onStartTrackingTouch(SeekBar seekBar)

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)

public void onStopTrackingTouch(SeekBar seekBar)

当按住滑杆后,系统会调用onStartTrackingTouch方法,在滑杆滑动时,会调用onProgressChanged方法,松开会调用onStopTrackingTouch

下面一个例子:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:id="@+id/textview1" android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
	<TextView android:id="@+id/textview2" android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
	<SeekBar android:id="@+id/seekbar1" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:max="100"
		android:progress="30" />
	<SeekBar android:id="@+id/seekbar2" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:max="100"
		android:progress="30" android:secondaryProgress="60"/>
</LinearLayout>
java代码文件:

public class Main extends Activity implements OnSeekBarChangeListener
{
	private TextView textView1;
	private TextView textView2;

	@Override
	public void onProgressChanged(SeekBar seekBar, int progress,
			boolean fromUser)
	{
		if (seekBar.getId() == R.id.seekbar1)
			textView2.setText("seekbar1的当前位置:" + progress);
		else
			textView2.setText("seekbar2的当前位置:" + progress);
	}

	@Override
	public void onStartTrackingTouch(SeekBar seekBar)
	{
		if (seekBar.getId() == R.id.seekbar1)
			textView1.setText("seekbar1开始拖动");
		else
			textView1.setText("seekbar2开始拖动");
	}

	@Override
	public void onStopTrackingTouch(SeekBar seekBar)
	{
		if (seekBar.getId() == R.id.seekbar1)
			textView1.setText("seekbar1停止拖动");
		else
			textView1.setText("seekbar2停止拖动");
	}

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		SeekBar seekBar1 = (SeekBar) findViewById(R.id.seekbar1);
		seekBar1.setOnSeekBarChangeListener(this);
		SeekBar seekBar2 = (SeekBar) findViewById(R.id.seekbar2);
		seekBar2.setOnSeekBarChangeListener(this);
		textView1 = (TextView) findViewById(R.id.textview1);
		textView2 = (TextView) findViewById(R.id.textview2);
	}
}
3、设置ProgressBar和SeekBar控件的颜色和背景图

ProgressBar和seekbar控件默认都是黄色的,而且这两个类并未提供直接修改颜色或背景图的方法和属性。不过有另外一个属性android:progressDrawable

其实一个完整的ProgressBar或者SeekBar是由3部分组成的:1级进度、2级进度、背景

下面一个例子:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:layout_marginTop="5dp"
		android:text="barcolor1" />
	<ProgressBar android:id="@+id/progressBarHorizontal1"
		android:layout_width="fill_parent" android:layout_height="wrap_content"
		style="?android:attr/progressBarStyleHorizontal"
		android:max="100" android:progress="30" android:secondaryProgress="60"
		android:progressDrawable="@drawable/barcolor1" />
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:layout_marginTop="5dp"
		android:text="barcolor2" />
	<ProgressBar android:id="@+id/progressBarHorizontal2"
		android:layout_width="fill_parent" android:layout_height="wrap_content"
		 style="?android:attr/progressBarStyleHorizontal"
		android:max="100" android:progress="30" android:secondaryProgress="60"
		android:progressDrawable="@drawable/barcolor2" />
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:layout_marginTop="5dp"
		android:text="barcolor1" />
	<SeekBar android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:max="100"
		 android:progress="30"
		android:progressDrawable="@drawable/barcolor1" />
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:layout_marginTop="5dp"
		android:text="barcolor2" />
	<SeekBar android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:max="100"
		 android:progress="30"
		android:progressDrawable="@drawable/barcolor2" />
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:layout_marginTop="5dp"
		android:text="Face拖动条" />
	<SeekBar android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:max="100"
		android:progress="30" android:progressDrawable="@drawable/barface" />
</LinearLayout>
barface.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/bg" />
	<item android:id="@android:id/progress" android:drawable="@drawable/face" />
</layer-list>                    
barcolor1.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/bg" />
	<item android:id="@android:id/secondaryProgress" android:drawable="@drawable/secondary"  />
	<item android:id="@android:id/progress" android:drawable="@drawable/progress" />
</layer-list>              
barcolor2.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">
		<shape>
			<corners android:radius="10dip" />
			<gradient android:startColor="#FFFF0000"
				android:centerColor="#FF880000" android:centerY="0.75"
				android:endColor="#FF110000" android:angle="270" />
		</shape>
	</item>
	<item android:id="@android:id/secondaryProgress">
		<clip>
			<shape>
				<corners android:radius="10dp" />
				<gradient android:startColor="#FF00FF00"
					android:centerColor="#FF00FF00" android:centerY="0.75"
					android:endColor="#FF00FF00" android:angle="270" />
			</shape>
		</clip>
	</item>
	<item android:id="@android:id/progress">
		<clip>
			<shape>
				<corners android:radius="10dp" />
				<gradient android:startColor="#ffffd300"
					android:centerColor="#ffffb600" android:centerY="0.75"
					android:endColor="#ffffcb00" android:angle="270" />
			</shape>
		</clip>
	</item>
</layer-list>
4、RatingBar控件

RatingBar是一个评分控件,有3个常用属性:

android:numStars 用于指定评分的五角星数

android:rating 用于指定当前分数

android:stepSize 用于指定分数的增量单位,默认是0.5

OnRatingBarChangeListener接口可以监听RatingBar分数的变化,在OnRatingChanged方法处理分数变化。

下面一个例子:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="3颗星,步长是0.5" />
	<RatingBar android:id="@+id/ratingbar1" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:numStars="3" 
		android:rating="2" />
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="5颗星,步长是0.1" />
	<RatingBar android:id="@+id/ratingbar2" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:numStars="5"
		android:stepSize="0.1" />
	<LinearLayout android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:layout_marginTop="10dip">

		<TextView android:id="@+id/textview" android:layout_width="wrap_content"
			android:layout_height="wrap_content"  />
		<RatingBar android:id="@+id/smallRatingbar" style="?android:attr/ratingBarStyleSmall"
			android:layout_marginLeft="5dip" android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
	</LinearLayout>
	<RatingBar android:id="@+id/indicatorRatingbar" style="?android:attr/ratingBarStyleIndicator"
		android:layout_marginLeft="5dip" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:stepSize="0.1" />

</LinearLayout>
java文件:

public class Main extends Activity implements OnRatingBarChangeListener
{
	private RatingBar smallRatingBar;
	private RatingBar indicatorRatingBar;
	private TextView textView;

	@Override
	public void onRatingChanged(RatingBar ratingBar, float rating,
			boolean fromUser)
	{
		smallRatingBar.setRating(rating);
		indicatorRatingBar.setRating(rating);
		if (ratingBar.getId() == R.id.ratingbar1)
			textView.setText("ratingbar1的分数:" + rating);
		else
			textView.setText("ratingbar2的分数:" + rating);
		
	}

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		RatingBar ratingBar1 = (RatingBar) findViewById(R.id.ratingbar1);
		RatingBar ratingBar2 = (RatingBar) findViewById(R.id.ratingbar2);
		textView = (TextView) findViewById(R.id.textview);

		ratingBar1.setOnRatingBarChangeListener(this);
		ratingBar2.setOnRatingBarChangeListener(this);
		
		smallRatingBar = (RatingBar) findViewById(R.id.smallRatingbar);
		indicatorRatingBar = (RatingBar) findViewById(R.id.indicatorRatingbar);
	}
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值