Android平臺(tái)的事件處理機(jī)制有兩種,一種是基于回調(diào)機(jī)制的,一種是基于監(jiān)聽接口的,現(xiàn)介紹第一種:基于回調(diào)機(jī)制的事件處理。
Android平臺(tái)中,每個(gè)View都有自己的處理事件的回調(diào)方法,開發(fā)人員可以通過重寫View中的這些回調(diào)方法來實(shí)現(xiàn)需要的響應(yīng)事件。當(dāng)某個(gè)事件沒有被任何一個(gè)View處理時(shí),便會(huì)調(diào)用Activity中相應(yīng)的回調(diào)方法。Android提供了以下回調(diào)方法供用戶使用:
1. onKeyDown:
功能:該方法是接口KeyEvent.Callback中的抽象方法,所有的View全部實(shí)現(xiàn)了該接口并重寫了該方法,該方法用來捕捉手機(jī)鍵盤被按下的事件。
聲明:public boolean onKeyDown (int keyCode, KeyEvent event)
參數(shù)說明:
參數(shù)keyCode,該參數(shù)為被按下的鍵值即鍵盤碼,手機(jī)鍵盤中每個(gè)按鈕都會(huì)有其單獨(dú)的鍵盤碼,在應(yīng)用程序都是通過鍵盤碼才知道用戶按下的是哪個(gè)鍵。
參數(shù)event,該參數(shù)為按鍵事件的對象,其中包含了觸發(fā)事件的詳細(xì)信息,例如事件的狀態(tài)、事件的類型、事件發(fā)生的時(shí)間等。當(dāng)用戶按下按鍵時(shí),系統(tǒng)會(huì)自動(dòng)將事件封 裝成KeyEvent對象供應(yīng)用程序使用。
返回值,該方法的返回值為一個(gè)boolean類型的變量,當(dāng)返回true時(shí),表示已經(jīng)完整地處理了這個(gè)事件,并不希望其他的回調(diào)方法再次進(jìn)行處理,而當(dāng)返回false時(shí),表示并沒有完全處理完該事件,更希望其他回調(diào)方法繼續(xù)對其進(jìn)行處理,例如Activity中的回調(diào)方法。
2. onKeyUp:
功能:該方法同樣是接口KeyEvent.Callback中的一個(gè)抽象方法,并且所有的View同樣全部實(shí)現(xiàn)了該接口并重寫了該方法,onKeyUp方法用來捕捉手機(jī)鍵盤按鍵抬起的事件。
聲明:public boolean onKeyUp (int keyCode, KeyEvent event)
參數(shù)說明: 同onKeyDown
3. onTouchEvent:
功能:該方法在View類中的定義,并且所有的View子類全部重寫了該方法,應(yīng)用程序可以通過該方法處理手機(jī)屏幕的觸摸事件。
聲明:public boolean onTouchEvent (MotionEvent event)
參數(shù)說明:
參數(shù)event:參數(shù)event為手機(jī)屏幕觸摸事件封裝類的對象,其中封裝了該事件的所有信息,例如觸摸的位置、觸摸的類型以及觸摸的時(shí)間等。該對象會(huì)在用戶觸摸手機(jī)屏幕時(shí)被創(chuàng)建。
返回值:該方法的返回值機(jī)理與鍵盤響應(yīng)事件的相同,同樣是當(dāng)已經(jīng)完整地處理了該事件且不希望其他回調(diào)方法再次處理時(shí)返回true,否則返回 false。
詳細(xì)說明:
該方法并不像之前介紹過的方法只處理一種事件,一般情況下以下三種情況的事件全部由onTouchEvent方法處理,只是三種情況中的動(dòng)作值不同。
屏幕被按下:當(dāng)屏幕被按下時(shí),會(huì)自動(dòng)調(diào)用該方法來處理事件,此時(shí)MotionEvent.getAction()的值為 MotionEvent.ACTION_DOWN,如果在應(yīng)用程序中需要處理屏幕被按下的事件,只需重新該回調(diào)方法,然后在方法中進(jìn)行動(dòng)作的判斷即可。
屏幕被抬起:當(dāng)觸控筆離開屏幕時(shí)觸發(fā)的事件,該事件同樣需要onTouchEvent方法來捕捉,然后在方法中進(jìn)行動(dòng)作判斷。當(dāng) MotionEvent.getAction()的值為MotionEvent.ACTION_UP時(shí),表示是屏幕被抬起的事件。
在屏幕中拖動(dòng):該方法還負(fù)責(zé)處理觸控筆在屏幕上滑動(dòng)的事件,同樣是調(diào)用MotionEvent.getAction()方法來判斷動(dòng)作值是否為 MotionEvent.ACTION_MOVE再進(jìn)行處理。
4. onTrackBallEvent:
功能: 接下來將介紹的是手機(jī)中軌跡球的處理方法onTrackBallEvent。所有的View同樣全部實(shí)現(xiàn)了該方法。
聲明: public boolean onTrackballEvent (MotionEvent event)
詳細(xì)說明:該方法的使用方法與前面介紹過的各個(gè)回調(diào)方法基本相同,可以在Activity中重寫該方法,也可以在各個(gè)View的實(shí)現(xiàn)類中重寫。
參數(shù)event:參數(shù)event為手機(jī)軌跡球事件封裝類的對象,其中封裝了觸發(fā)事件的詳細(xì)信息,同樣包括事件的類型、觸發(fā)時(shí)間等,一般情況下,該對象會(huì)在用戶操控軌跡球時(shí)被創(chuàng)建。
返回值:該方法的返回值與前面介紹的各個(gè)回調(diào)方法的返回值機(jī)制完全相同,因本書篇幅有限,不再贅述。
軌跡球與手機(jī)鍵盤的區(qū)別如下所示:
1) 某些型號的手機(jī)設(shè)計(jì)出的軌跡球會(huì)比只有手機(jī)鍵盤時(shí)更美觀,可增添用戶對手機(jī)的整體印象。
2) 軌跡球使用更為簡單,例如在某些游戲中使用軌跡球控制會(huì)更為合理。
3)使用軌跡球會(huì)比鍵盤更為細(xì)化,即滾動(dòng)軌跡球時(shí),后臺(tái)的表示狀態(tài)的數(shù)值會(huì)變化得更細(xì)微、更精準(zhǔn)。
提示:在模擬器運(yùn)行狀態(tài)下,可以通過F6鍵打開模擬器的軌跡球,然后便可以通過鼠標(biāo)的移動(dòng)來模擬軌跡球事件。
5. onFocusChanged:
功能: 前面介紹的各個(gè)方法都可以在View及Activity中重寫,接下來介紹的onFocusChanged卻只能在View中重寫。該方法是焦點(diǎn)改變的回調(diào)方法,當(dāng)某個(gè)控件重寫了該方法后,當(dāng)焦點(diǎn)發(fā)生變化時(shí),會(huì)自動(dòng)調(diào)用該方法來處理焦點(diǎn)改變的事件。
聲明:protected void onFocusChanged (boolean gainFocus, int direction, Rect previously FocusedRect)
詳細(xì)說明:
參數(shù)gainFocus:參數(shù)gainFocus表示觸發(fā)該事件的View是否獲得了焦點(diǎn),當(dāng)該控件獲得焦點(diǎn)時(shí),gainFocus等于true,否則等于false。
參數(shù)direction:參數(shù)direction表示焦點(diǎn)移動(dòng)的方向,用數(shù)值表示,有興趣的讀者可以重寫View中的該方法打印該參數(shù)進(jìn)行觀察。
參數(shù)previouslyFocusedRect:表示在觸發(fā)事件的View的坐標(biāo)系中,前一個(gè)獲得焦點(diǎn)的矩形區(qū)域,即表示焦點(diǎn)是從哪里來的。如果不可用則為null。
提示:
焦點(diǎn):焦點(diǎn)描述了按鍵事件(或者是屏幕事件等)的承受者,每次按鍵事件都發(fā)生在擁有焦點(diǎn)的View上。在應(yīng)用程序中,我們可以對焦點(diǎn)進(jìn)行控制,例如從一個(gè) View移動(dòng)另一個(gè)View。下面列出一些與焦點(diǎn)有關(guān)的常用方法:
setFocusable方法:設(shè)置View是否可以擁有焦點(diǎn)。
isFocusable方法:監(jiān)測此View是否可以擁有焦點(diǎn)。
setNextFocusDownId方法:設(shè)置View的焦點(diǎn)向下移動(dòng)后獲得焦點(diǎn)View的ID。
hasFocus方法:返回了View的父控件是否獲得了焦點(diǎn)。
requestFocus方法:嘗試讓此View獲得焦點(diǎn)。
isFocusableTouchMode方法:設(shè)置View是否可以在觸摸模式下獲得焦點(diǎn),在默認(rèn)情況下是不可用獲得的。
轉(zhuǎn)自
http://blog.csdn.net/liranke