都知道水果公司(蘋果)是己尊重用戶體驗著稱的公司,其設計的產品人性化十足,不得不令後來者贊歎,競相模仿。iphone的成功就是其典型的案例,做為其移動系統的死對頭 Google 想要在市場上分得一杯羹用戶體驗也是其不能小看的一個重要部分。Android系統出道時,就以一系列具富觀賞性的UI組件捕獲了眾多的 Android 應用層的設計人員與開發人員,比較典型的兩個與用戶交互的控件為:進度條 ProgressBar 與 拖動條 SeekBar。
進度條(ProgressBar)
當一個應用程序在後台執行時,前台界面不會產生變化,但因為 Android 各機型配置大不相同,有時執行程序的過程中用戶不知道發生了什麼事,但界面卻發生了變化。這時需要與用戶交互的進度條用來提示用戶後台執行程序的進度,這種做法是符合人性化的,進度條充分的符合上面的需求。進度條的詳解如下:
- 1、進度條風格
- 2、進度條主要屬性方法
- 3、模擬程序運行,使用進度條
1、進度條分類
- 長形進度條 (progressBarStyleHorizontal)
- 大圓形進度條(progressBarStyleLarge)
- 小圓形進度條 (progressBarStyleSmall)
- 默認風格 (progressBarStyle)
大致的使用場景為:比如,應用程序裝載資源或者網絡連接。下面介紹如何在 xml 中聲明其中兩種典型的進度條,先看一段布局
<?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:text="@string/hello"
/>
<ProgressBar android:id="@ id/ProgressBar01" android:layout_width="200dp"
style="?android:attr/progressBarStyleHorizontal"
android:layout_height="wrap_content"
android:indeterminate="false"
android:visibility="gone"
></ProgressBar>
<ProgressBar android:id="@ id/ProgressBar02" android:layout_width="wrap_content"
android:max="100"
style="?android:attr/progressBarStyleLarge"
android:progress="50" android:secondaryProgress="70"
android:indeterminate="false"
android:visibility="gone"
android:layout_height="wrap_content"></ProgressBar>
<Button android:text="開始" android:id="@ id/Button01"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
清單中,ProgressBar01為長形進度條,ProgressBar02為大圓形進度條,使用方法為聲明“style=”在樣式上加上各自屬性,加載即可。
2、進度條主要屬性方法
- indeterminate
進度條分 不確定 (indeterminate=true)和 確定 (indeterminate=false)2種,默認值是(indeterminate=true)不確定
- setMax
設置進度條的最大值,同時,確定(indeterminate=false)進度條中的最大值的設定,將調用 setMax()方法。
- setProgress
Android 進度條中當前進度值的設置。
- setSecondaryProgress
第二進度條的設置。
- setVisibility
設置可見性。
3、模擬程序運行,使用進度條
界面布局引用上面 XML 布局文件,現在開始程序的實現步驟了:程序加載時,設置兩個進度條的當前進度值為0,從0開始到Max值 100,的數值做遞值相加,用戶點擊按鈕時,模擬程序運行時間,起動一個線程為進度條的Progress 賦值。這裡我們需要借助線程和消息機制幫我們實現數值累加的效果,在消息裡面當接收到的消息符合我們條件判斷隱藏進度條的運行。具體業務邏輯代碼如下:
模擬程序運行線程代碼如下:
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i )
{
try {
counter=(i 1)*20;
Thread.sleep(1000);
if(i==4)
{
Message msg=new Message();
msg.what=GUI_STOP;
progressBarActivity.this.myHandler.sendMessage(msg);
break;
}
else
{
Message msg=new Message();
msg.what=GUI_THREADING;
progressBarActivity.this.myHandler.sendMessage(msg);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}).start();
消息處理代碼如下:
myHandler=new Handler()
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case GUI_STOP:
myBar.setVisibility(View.GONE);
myBar2.setVisibility(View.GONE);
Thread.currentThread().interrupt();
break;
case GUI_THREADING:
if(!Thread.currentThread().interrupted())
{
myBar.setProgress(counter);
myBar2.setProgress(counter);
setProgress(counter*100);
setSecondaryProgress(counter*100);
}
break;
default:
break;
}
super.handleMessage(msg);
}
};
具體線程和消息機制的使用方法你可以參照:Android小項目之---時間線程應用(附源碼) 或者 Android 小項目之--消息、線程、動畫顯示圖片(附源碼) 線程和消息機制這兩個知識點,必須掌握好,在項目中會經常使用到。具體的代碼流程如下:
進度條完整代碼參考
package com.terry;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class progressBarActivity extends Activity {
private ProgressBar myBar;
private ProgressBar myBar2;
private Button myButton;
private Handler myHandler;
protected static final int GUI_STOP=0x1110;
protected static final int GUI_THREADING=0x122;
private int counter=0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
setProgressBarVisibility(true);
setContentView(R.layout.main);
/*
* 查找對象
*/
myBar=(ProgressBar)findViewById(R.id.ProgressBar01);
myBar2=(ProgressBar)findViewById(R.id.ProgressBar02);
myButton=(Button)findViewById(R.id.Button01);
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
myBar.setVisibility(View.VISIBLE);
myBar2.setVisibility(View.VISIBLE);
myBar.setMax(100);
myBar.setProgress(0);
myBar2.setProgress(0);
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i )
{
try {
counter=(i 1)*20;
Thread.sleep(1000);
if(i==4)
{
Message msg=new Message();
msg.what=GUI_STOP;
progressBarActivity.this.myHandler.sendMessage(msg);
break;
}
else
{
Message msg=new Message();
msg.what=GUI_THREADING;
progressBarActivity.this.myHandler.sendMessage(msg);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}).start();
}
});
myHandler=new Handler()
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case GUI_STOP:
myBar.setVisibility(View.GONE);
myBar2.setVisibility(View.GONE);
Thread.currentThread().interrupt();
break;
case GUI_THREADING:
if(!Thread.currentThread().interrupted())
{
myBar.setProgress(counter);
myBar2.setProgress(counter);
setProgress(counter*100);
setSecondaryProgress(counter*100);
}
break;
default:
break;
}
super.handleMessage(msg);
}
};
}
}
運行效果如圖:
拖動條(SeekBar)
聽歌的時候,我們常常喜歡快進或者退回某一時間段,聽歌的時候,我們喜歡控件音量大小來聽歌。做為與用戶交互密切的另外一個控件SeekBar拖動條,可以讓用戶拖動達到用戶需要的效果的控件,在無外乎大大提高用戶的體驗。下面我們來講講此拖動條。
- 1、拖動條的事件。
- 2、拖動條的主要屬性和方法。
- 3、模擬方式實現手動的動作。
1、拖動條的事件
由於拖動條可以被用戶控制。所以需要對其進行事件監聽,這就需要實現SeekBar.OnSeekBarChangeListener接口。此接口共需要監聽三個事件,分別是:
- 數值改變(onProgressChanged)
- 開始拖動(onStartTrackingTouch)
- 停止拖動(onStopTrackingTouch)
2、 拖動條的主要屬性和方法
- setMax
設置拖動條的數值
- setProgress
設置拖動條當前的數值
- setSeconddaryProgress
設置第二拖動條的數值,即當前拖動條推薦的數值
3、模擬方式實現手動的動作
程序中模仿了用戶拖動拖動條的過程,對三個事件分別作了訊錄,代碼如下:
拖動條全部源碼
package com.terry;
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 SeekBar seek;
private TextView myTextView;
private TextView myTextView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.seekbardemo);
seek=(SeekBar)findViewById(R.id.SeekBar01);
myTextView=(TextView)findViewById(R.id.TextView01);
myTextView2=(TextView)findViewById(R.id.TextView02);
seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
myTextView2.setText("停止調節");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
myTextView2.setText("開始調節");
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
myTextView.setText("當前值 為:" progress);
}
});
}
}
運行效果如圖:
較之進度條,拖動條的使用比進度條要簡單得多,只要在對應的事件處理邏輯即可,具體詳細的使用,具體項目中慢慢體會吧。。。
源碼下載:/Files/TerryBlog/progressBarDemo.rar