Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android小項目之--前台界面與用戶交互的對接 進度條與拖動條(附源碼)

Android小項目之--前台界面與用戶交互的對接 進度條與拖動條(附源碼)

編輯:Android開發實例

  都知道水果公司(蘋果)是己尊重用戶體驗著稱的公司,其設計的產品人性化十足,不得不令後來者贊歎,競相模仿。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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved