編輯:Android開發實例
前言
開門見山,開篇明意。這篇主要講解一下Android中ProgressBar控件以及間接繼承它的兩個子控件SeekBar、RatingBar的基本用法,因為其有繼承關系,存在一些共有特性,所以在一篇中講解。下面先簡單描述一下這三個控件:
ProgressBar
ProgressBar,進度條,是AndroidUI界面中一個非常實用的組件,通常用於向用戶顯示某個耗時操作完成的百分比。因此它需要動態的顯示進度,從而避免長時間的執行某個耗時的操作,而讓用戶感覺程序失去了相應,從而提高界面的友好性。
從官方文檔上看,為了適應不同的應用環境,Android內置了幾種風格的進度條,可以通過Style屬性設置ProgressBar的風格。支持如下屬性,後面在示例中會一一展示:
只有Widget.ProgressBar.Horizontal風格的進度條,才可以設置進度的遞增,其他的風格展示為一個循環的動畫,而設置Widget.ProgressBar.Horizontal風格的進度條,需要用到一些屬性設置遞增的進度,這些屬性都有對應的setter、getter方法,這些屬性如下:
對於Widget.ProgressBar.Horizontal風格的進度條而言,在代碼中動態設置移動量,除了可以使用setProgress(int)方法外,Android還為我們提供了另外一個incrementProgressBy(int)方法,它與setProgress(int)的根本區別在於,setProgress(int)是直接設置當前進度值,而incrementProgressBy(int)是設置當前進度值的增量(正數為增,負數為減)。與setProgress(int)和incrementProgressBy(int)對應的還有setSecondaryProgress(int)和incrementSecondaryProgressBy(int)方法,用於設置第二進度值。
下面通過一個示例,來講解一下上面的style設置樣式的展示想過,以及動態控制進度條增減的實現。
布局代碼:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="android:style/Widget.ProgressBar.Small" />
- <ProgressBar
- style="@android:style/Widget.ProgressBar.Small"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="android:style/Widget.ProgressBar.Large" />
- <ProgressBar
- android:id="@+id/pbLarge"
- style="@android:style/Widget.ProgressBar.Large"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="android:style/Widget.ProgressBar.Inverse" />
- <ProgressBar
- style="@android:style/Widget.ProgressBar.Inverse"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="android:style/Widget.ProgressBar.Small.Inverse" />
- <ProgressBar
- style="@android:style/Widget.ProgressBar.Small.Inverse"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="android:style/Widget.ProgressBar.Large.Inverse" />
- <ProgressBar
- style="@android:style/Widget.ProgressBar.Large.Inverse"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="android:style/Widget.ProgressBar.Horizontal" />
- <ProgressBar
- android:id="@+id/pbHor"
- style="@android:style/Widget.ProgressBar.Horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:max="100"
- android:progress="20"
- android:secondaryProgress="60" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal" >
- <!-- 設置一個按鈕控制水平進度的遞增 -->
- <Button
- android:id="@+id/btnAdd"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text=" + " />
- <!-- 設置一個按鈕控制水平進度的遞減 -->
- <Button
- android:id="@+id/btnReduce"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="30dp"
- android:text=" - " />
- <!-- 設置一個按鈕控制Style為large的進度顯示與隱藏 -->
- <Button
- android:id="@+id/btnVisible"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="30dp"
- android:text="VisibleLarge" />
- </LinearLayout>
- </LinearLayout>
實現代碼:
- package com.bgxt.progressbarseriesdemo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ProgressBar;
- public class ProgressBarActivity extends Activity {
- private Button btnAdd, btnReduce, btnVisible;
- private ProgressBar pbHor, pbLarge;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_progressbar);
- btnAdd = (Button) findViewById(R.id.btnAdd);
- btnReduce = (Button) findViewById(R.id.btnReduce);
- btnVisible = (Button) findViewById(R.id.btnVisible);
- pbHor = (ProgressBar) findViewById(R.id.pbHor);
- pbLarge = (ProgressBar) findViewById(R.id.pbLarge);
- btnAdd.setOnClickListener(mathClick);
- btnReduce.setOnClickListener(mathClick);
- btnVisible.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // 判斷Large進度條是否顯示,顯示則隱藏,隱藏則顯示
- if (pbLarge.getVisibility() == View.VISIBLE) {
- pbLarge.setVisibility(View.GONE);
- } else {
- pbLarge.setVisibility(View.VISIBLE);
- }
- }
- });
- }
- private View.OnClickListener mathClick = new OnClickListener() {
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btnAdd:
- // 如果是增加按鈕,因為進度條的最大值限制在100,第一刻度限制在90.
- // 在此限度內,以1.2倍遞增
- // 使用setProgress()
- if (pbHor.getProgress() < 90) {
- pbHor.setProgress((int) (pbHor.getProgress() * 1.2));
- }
- if (pbHor.getSecondaryProgress() < 100) {
- pbHor.setSecondaryProgress((int) (pbHor
- .getSecondaryProgress() * 1.2));
- }
- break;
- case R.id.btnReduce:
- // 如果是增加按鈕,因為進度條的最大值限制在100,第一刻度限制在10.第二刻度限制在20
- // 在此限度內,以10點為基數進行遞減。
- // 使用incrementXxxProgressBy(int)
- if (pbHor.getProgress() > 10) {
- pbHor.incrementProgressBy(-10);
- }
- if (pbHor.getSecondaryProgress() > 20) {
- pbHor.incrementSecondaryProgressBy(-10);
- }
- break;
- }
- }
- };
- }
展示效果:初始--遞增--隱藏
SeekBar
SeekBar,拖動條控件 ,間接繼承自ProgressBar,所以與進度條類似,但是進度條采用顏色填充來表名進度完成的程度,而拖動條則通過滑動的位置來標識數值。
SeekBar繼承自ProgressBar,所以也繼承了它的屬性設置,上面介紹的一些屬性在SeekBar中都可以用到。因為SeekBar涉及到一個滑塊的概念,所以新增了屬性android:thumb來通過設置一個Drawable對象,指定自定義滑塊的外觀,當然如果不設定也可以默認使用Android自帶的風格。
當用戶按住滑塊進行滑動的時候,會觸發一個SeekBar.OnSeekBarChangeListener事件,這是一個接口,需要開發人員實現三個方法:
下面通過一個示例來講解一下SeekBar的基本用法。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/textview1"
- android:layout_width="match_parent"
- android:layout_height="30dp" />
- <TextView
- android:id="@+id/textview2"
- android:layout_width="match_parent"
- android:layout_height="30dp" />
- <SeekBar
- android:layout_marginTop="30dp"
- android:id="@+id/seekbar1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:max="100"
- android:progress="30" />
- <!--設置一個拖動條,滑塊為定義的bar圖片-->
- <SeekBar
- android:layout_marginTop="30dp"
- android:id="@+id/seekbar2"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:max="100"
- android:progress="20"
- android:thumb="@drawable/bar"
- android:secondaryProgress="80" />
- </LinearLayout>
實現代碼:
- package com.bgxt.progressbarseriesdemo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.SeekBar;
- import android.widget.TextView;
- import android.widget.SeekBar.OnSeekBarChangeListener;
- public class SeekBarActivity extends Activity {
- private TextView textview1, textview2;
- private SeekBar seekbar1, seekbar2;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_seekbar);
- textview1 = (TextView) findViewById(R.id.textview1);
- textview2 = (TextView) findViewById(R.id.textview2);
- seekbar1 = (SeekBar) findViewById(R.id.seekbar1);
- seekbar2 = (SeekBar) findViewById(R.id.seekbar2);
- seekbar1.setOnSeekBarChangeListener(seekBarChange);
- seekbar2.setOnSeekBarChangeListener(seekBarChange);
- }
- private OnSeekBarChangeListener seekBarChange = new OnSeekBarChangeListener() {
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- if (seekBar.getId() == R.id.seekbar1) {
- textview1.setText("seekbar1停止拖動");
- } else {
- textview1.setText("seekbar2停止拖動");
- }
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- if (seekBar.getId() == R.id.seekbar1) {
- textview1.setText("seekbar1開始拖動");
- } else {
- textview1.setText("seekbar2開始拖動");
- }
- }
- @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);
- }
- }
- };
- }
效果展示:
RatingBar
RatingBar,星級評分控件,RatingBar與SeekBar的用法非常相似,並且具有相同的父類AbsSeekBar,AbsSeekbar又繼承自ProgressBar。而RatingBar與SeekBar最大的區別在於:RatingBar通過星形圖標來表示進度。
RatingBar擴展了AbsSeekbar,所以新增了一些固有的屬性,也屏蔽了一些無用的屬性,如在RatingBar中就不存在第二進度的概念,新增的屬性有如下幾個:
對於RatingBar而言,當改變其星級選項的時候,會觸發一個RatingBar.OnRatingBarChangeListener事件,這是一個接口,需要實現其中的onRatingChanged(RatingBar ratingBar,float rating,boolean fromUser)方法,其中ratingBar表示觸發事件的控件,rating表示當前的星級,fromUser表示是否用戶觸發的修改事件。
在這裡需要注意的一點就是,因為繼承關系,RatingBar也有Progress屬性,但是還有另外一個屬性rating表示星級。這兩個屬性代表的意義是有區別的,區別在於Progress屬性針對的是Max屬性設置的值而言的,而rating是單純的表示第幾顆星。
下面通過一個示例來展示一下評分控件的基本使用。
布局代碼:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="評分控件的使用"
- android:textSize="20dp" />
- <RatingBar
- android:id="@+id/rbRating"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <RatingBar
- android:id="@+id/rbRating1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:isIndicator="false"
- android:max="100"
- android:numStars="4"
- android:rating="2.5"
- android:stepSize="0.5" />
- </LinearLayout>
實現代碼:
- package com.bgxt.progressbarseriesdemo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.RatingBar;
- import android.widget.RatingBar.OnRatingBarChangeListener;
- import android.widget.Toast;
- public class RatingBarActivity extends Activity implements OnRatingBarChangeListener {
- private RatingBar rbRating,rbRating1;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_ratingbar);
- rbRating=(RatingBar)findViewById(R.id.rbRating);
- rbRating1=(RatingBar)findViewById(R.id.rbRating1);
- //手動設置第一個RatingBar的屬性值
- rbRating.setMax(100);
- rbRating.setProgress(20);
- rbRating.setOnRatingBarChangeListener(this);
- rbRating1.setOnRatingBarChangeListener(this);
- }
- @Override
- public void onRatingChanged(RatingBar ratingBar, float rating,
- boolean fromUser) {
- //分別顯示Progress屬性和rating屬性的不同
- int progress=ratingBar.getProgress();
- Toast.makeText(RatingBarActivity.this, "progress:"+progress+" rating :"+rating,Toast.LENGTH_SHORT).show();
- }
- }
展示效果:
示例代碼下載
總結
以上就詳細說明了ProgressBar控件以及其兩個子控件的用法,此處不包括控件樣式的設置,對於控件的展示效果,以後再進行詳解。
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
1.黑白效果 代碼如下:/** * 將彩色圖轉換為黑白圖 * &n
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我