Android的事件類型及事件處理機制

Android提供了強大的事件處理機制,包括兩套事件處理機制:


------------------基於監聽的事件處理。
------------------基於回調的事件處理(適合處理那種處理邏輯比較固定的View)。


對於基於監聽的事件模型來說,事件源和事件監聽器是分離的,當事件源上發生特定事件之後,該事件交給事件監聽器來處理;

對於基於回調的事件處理模型來說,事件源和事件監聽器是統一的,當事件源發生特定事件後,該事件還是事件源本身負責處理。

一、回調概念

在實現具有通用性質的應用架構時非常常見:對於一個具有通用架構的程序來說,程序架構完成整個程序的通用功能、流程,但在某個特定的點上,需要一段業務相關的代碼——通用的程序架構無法實現這段代碼,那麼程序架構會在這個點上留一個“空”。
對於Java程序來說,程序架構在這個點上的留的“空”,可以以一下兩種方式存在。

以接口形式存在:該接口由開發者實現,實現該接口時會實現該接口的方法,那麼通用的程序架構就會調用該方法來完成相關業務的處理。
以抽象方法(也可以說是非抽象方法)的形式存在:這就是Activity的實現形式,這些特定的點上的方法已經被定義了,如onCreate,onActivityResult等方法,開發者可以選擇性地重寫這些方法,通用的程序架構就會回調這些方法來完成相關業務的處理。
幾乎所有基於回調的事件處理方法都有一個boolean類型的返回值,該返回值用於標識該處理方法是否能完全處理該事件:

如果處理事件的回調方法返回true,表明該處理方法已完全處理該事件,該事件不會傳播出去。
如果事件處理的回調方法返回false,表明該處理方法並未完全處理事件,該事件會傳播出去。

 

某組件上發生的事情不僅激發該組件上的回調方法,也會觸發該組件所在Activity的回調方法——只要事件能傳播到該Activity。

例如,當某個組件上發生某個按鍵按下的事件時,Android系統最先觸發的應該是該按鍵上綁定的監聽器,接着才觸發該組件個的事件回調方法,然後還會傳播到該組件所在的Activity。當然前提是事件處理方法返回的是false。

 

二、所謂的事件監聽器

其實就是實現了特定接口的java類的實例。
在程序中實現事件監聽器通常有以下幾種形式:

內部類形式:將事件監聽器類定義爲當前類的內部類、
外部類形式:將事件監聽器定義爲一個外部類。
Activity本身作爲事件監聽器類:讓Activity本身實現監聽器接口,並實現事件處理方法。
匿名內部類形式:使用匿名內部類創建事件監聽器對象。

 

 

對比Android提供的這兩種事件處理模型,會發現基於監聽的事件處理模型更具優勢:

基於監聽的事件模型分工更明確,事件源、事件監聽的兩個類分開實現,隱刺具有更好的可維護性。

Android的事件處理機制保證基於監聽的事件監聽器會被優先觸發。

 

 

Android不同事件的監聽接口:


一、View

View.onClickListener:單擊事件的事件監聽器必須實現的接口。
View.onCreateContextMenuListener:創建上下文菜單事件的事件監聽器必須實現的接口。
View.onFocusChangedListener:焦點改變事件的事件監聽器必須實現的接口。
View.onKeyListener:按鍵事件的時間監聽器必須實現的接口。
View.onLangClickListener:長單擊事件的事件監聽器必須實現的接口。
View.onTouchListener:觸摸屏事件的事件監聽器必須實現的接口。

 


Android不同事件的回調方法:


一、View

boolean onKeyDown(int keyCode,KenyEvent enent):當用戶在該組件上按下某個鍵時觸發的方法。
boolean onKeyLongPress(int keyCode,KeyEvent event):當用戶在該組件上長按某個按鍵時觸發的方法。
boolean onKeyShortcut(int keyCode,KeyEvent event):當一個鍵盤快捷鍵事件觸發時 觸發的方法。
boolean onKeyUp(int keyCode,KeyEvent event):當用戶在該組件上鬆開某個按鍵時觸發的方法。
boolean onTouchEvent(MotionEvent event):當用戶子在該組件上觸發觸摸屏事件時 觸發的方法。
boolean onTrackballEvent(MotionEvent event):當用戶在該組件上觸發軌跡球屏事件時觸發該方法。


附錄:Android事件類型

        現代的用戶界面,都是以事件來驅動的來實現人機交換的,而Android上的一套UI控件,主要是派發鼠標和鍵盤事件,然後每個控件收到相應的事件之後,做相應的處理。如Button控件,就只需要處理Down、move、up這幾個事件,Down的時候重繪控件,move的時候一般也需要重繪控件,當up的時候,重繪控件,然後產生onClick事件。在Android中通過實現OnClickListener接口的onClick方法來實現對Button控件的處理。

鼠標事件

對於觸摸屏事件(鼠標事件)有按下有:按下、彈起、移動、雙擊、長按、滑動、滾動。按下、彈起、移動(down、move、up)是簡單的觸摸屏事件,而雙擊、長按、滑動、滾動需要根據運動的軌跡來做識別的。在Android中有專門的類去識別,android.view.GestureDetector。

按鍵

按鍵(keyevent):按下、彈起、長按等。

 

 

FROM:

http://blog.csdn.net/csxwc/article/details/9351173

http://blog.chinaunix.net/uid-9688646-id-3267694.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章