Android平台的事件處理機制有兩種,一種是基於回調機制的,一種是基於監聽介面的,現介紹第一種:基於回調機制的事件處理。
Android平台中,每個View都有自己的處理事件的回調方法,開發人員可以通過重寫View中的這些回調方法來實現需要的響應事件。當某個事件沒有被任何一個View處理時,便會調用Activity中相應的回調方法。Android提供了以下回調方法供使用者使用:
1. onKeyDown:
功能:該方法是介面KeyEvent.Callback中的抽象方法,所有的View全部實現了該介面並重寫了該方法,該方法用來捕捉手機鍵盤被按下的事件。
聲明:public boolean onKeyDown (int keyCode, KeyEvent event)
參數說明:
參數keyCode,該參數為被按下的索引值即鍵盤碼,手機鍵盤中每個按鈕都會有其單獨的鍵盤碼,在應用程式都是通過鍵盤碼才知道使用者按下的是哪個鍵。
參數event,該參數為按鍵事件的對象,其中包含了觸發事件的詳細資料,例如事件的狀態、事件的類型、事件發生的時間等。當使用者按下按鍵時,系統會自動將事件封 裝成KeyEvent對象供應用程式使用。
傳回值,該方法的傳回值為一個boolean類型的變數,當返回true時,表示已經完整地處理了這個事件,並不希望其他的回調方法再次進行處理,而當返回false時,表示並沒有完全處理完該事件,更希望其他回調方法繼續對其進行處理,例如Activity中的回調方法。
2. onKeyUp:
功能:該方法同樣是介面KeyEvent.Callback中的一個抽象方法,並且所有的View同樣全部實現了該介面並重寫了該方法,onKeyUp方法用來捕捉手機鍵盤按鍵抬起的事件。
聲明:public boolean onKeyUp (int keyCode, KeyEvent event)
參數說明: 同onKeyDown
3. onTouchEvent:
功能:該方法在View類中的定義,並且所有的View子類全部重寫了該方法,應用程式可以通過該方法處理手機螢幕的觸摸事件。
聲明:public boolean onTouchEvent (MotionEvent event)
參數說明:
參數event:參數event為手機螢幕觸摸事件封裝類的對象,其中封裝了該事件的所有資訊,例如觸摸的位置、觸摸的類型以及觸摸的時間等。該對象會在使用者觸摸手機螢幕時被建立。
傳回值:該方法的傳回值機理與鍵盤響應事件的相同,同樣是當已經完整地處理了該事件且不希望其他回調方法再次處理時返回true,否則返回 false。
詳細說明:
該方法並不像之前介紹過的方法只處理一種事件,一般情況下以下三種情況的事件全部由onTouchEvent方法處理,只是三種情況中的動作值不同。
螢幕被按下:當螢幕被按下時,會自動調用該方法來處理事件,此時MotionEvent.getAction()的值為 MotionEvent.ACTION_DOWN,如果在應用程式中需要處理螢幕被按下的事件,只需重新該回調方法,然後在方法中進行動作的判斷即可。
螢幕被抬起:當觸控筆離開螢幕時觸發的事件,該事件同樣需要onTouchEvent方法來捕捉,然後在方法中進行動作判斷。當 MotionEvent.getAction()的值為MotionEvent.ACTION_UP時,表示是螢幕被抬起的事件。
在螢幕中拖動:該方法還負責處理觸控筆在螢幕上滑動的事件,同樣是調用MotionEvent.getAction()方法來判斷動作值是否為 MotionEvent.ACTION_MOVE再進行處理。
4. onTrackBallEvent:
功能: 接下來將介紹的是手機中軌跡球的處理方法onTrackBallEvent。所有的View同樣全部實現了該方法。
聲明: public boolean onTrackballEvent (MotionEvent event)
詳細說明:該方法的使用方法與前面介紹過的各個回調方法基本相同,可以在Activity中重寫該方法,也可以在各個View的實作類別中重寫。
參數event:參數event為手機軌跡球事件封裝類的對象,其中封裝了觸發事件的詳細資料,同樣包括事件的類型、觸發時間等,一般情況下,該對象會在使用者操控軌跡球時被建立。
傳回值:該方法的傳回值與前面介紹的各個回調方法的傳回值機制完全相同,因本書篇幅有限,不再贅述。
軌跡球與手機鍵盤的區別如下所示:
1) 某些型號的手機設計出的軌跡球會比只有手機鍵盤時更美觀,可增添使用者對手機的整體印象。
2) 軌跡球使用更為簡單,例如在某些遊戲中使用軌跡球控制會更為合理。
3)使用軌跡球會比鍵盤更為細化,即滾動軌跡球時,背景表示狀態的數值會變化得更細微、更精準。
提示:在模擬器運行狀態下,可以通過F6鍵開啟模擬器的軌跡球,然後便可以通過滑鼠的移動來類比軌跡球事件。
5. onFocusChanged:
功能: 前面介紹的各個方法都可以在View及Activity中重寫,接下來介紹的onFocusChanged卻只能在View中重寫。該方法是焦點改變的回調方法,當某個控制項重寫了該方法後,當焦點發生變化時,會自動調用該方法來處理焦點改變的事件。
聲明:protected void onFocusChanged (boolean gainFocus, int direction, Rect previously FocusedRect)
詳細說明:
參數gainFocus:參數gainFocus表示觸發該事件的View是否獲得了焦點,當該控制項獲得焦點時,gainFocus等於true,否則等於false。
參數direction:參數direction表示焦點移動的方向,用數值表示,有興趣的讀者可以重寫View中的該方法列印該參數進行觀察。
參數previouslyFocusedRect:表示在觸發事件的View的座標系中,前一個獲得焦點的矩形地區,即表示焦點是從哪裡來的。如果不可用則為null。
提示:
焦點:焦點描述了按鍵事件(或者是螢幕事件等)的承受者,每次按鍵事件都發生在擁有焦點的View上。在應用程式中,我們可以對焦點進行控制,例如從一個 View移動另一個View。下面列出一些與焦點有關的常用方法:
setFocusable方法:設定View是否可以擁有焦點。
isFocusable方法:監測此View是否可以擁有焦點。
setNextFocusDownId方法:設定View的焦點向下移動後獲得焦點View的ID。
hasFocus方法:返回了View的父控制項是否獲得了焦點。
requestFocus方法:嘗試讓此View獲得焦點。
isFocusableTouchMode方法:設定View是否可以在觸摸模式下獲得焦點,在預設情況下是不可用獲得的。