基于監聽的事件處理機制
流程模型圖
文字描述:
事件監聽機制中由事件源,事件,事件監聽器三類對象組成 處理流程如下: Step 1:為某個事件源(組件)設置一個監聽器,用于監聽用戶操作 Step 2:用戶的操作,觸發了事件源的監聽器 Step 3:生成了對應的事件對象 Step 4:將這個事件源對象作為參數傳給事件監聽器 step 5:事件監聽器對事件對象進行判斷,執行對應的事件處理器(對應事件的處理方法)
基于回調的事件處理機制
回調:一種解耦合的設計思想:分離 功能定義 與 功能。在Java中回調是通過接口來實現的,達到接口統一,實現不同。
回調和監聽的異同:
基于監聽的事件處理機制,簡單說就是為事件源(組件)添加一個監聽器,然后當用戶觸發了事件后交給監聽器去處理,根據不同的事件執行不同的操作。
對于基于回調的事件處理模型來說,事件源與事件監聽器是統一的,或者說事件監聽器完全消失了。當用戶在GUI組件上激發某個事件時,組件自己特定的方法將會負責處理該事件。-
兩個使用場景:
- 1 自定義view
當用戶在GUI組件上激發某個事件時,組件有自己特定的方法會負責處理該事件 通常用法:繼承基本的GUI組件,重寫該組件的事件處理方法,即自定義view 注意:在xml布局中使用自定義的
view
時,需要使用"全限定類名"實現代碼: MyButton.java
public class MyButton extends Button{ private static String TAG = "呵呵"; public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } //重寫鍵盤按下觸發的事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode,event); Log.i(TAG, "onKeyDown方法被調用"); return true; } //重寫彈起鍵盤觸發的事件 @Override public boolean onKeyUp(int keyCode, KeyEvent event) { super.onKeyUp(keyCode,event); Log.i(TAG,"onKeyUp方法被調用"); return true; } //組件被觸摸了 @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); Log.i(TAG,"onTouchEvent方法被調用"); return true; } }
因為我們直接重寫了
Button
的三個回調方法,當發生點擊事件后就不需要我們在Java文件中進行 事件監聽器的綁定就可以完成回調,即組件會處理對應的事件,即事件由事件源(組件)自身處理!-
2 基于回調的事件傳播:
代碼示例:
public class MyButton extends Button{ private static String TAG = "呵呵"; public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } //重寫鍵盤按下觸發的事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode,event); Log.i(TAG, "自定義按鈕的onKeyDown方法被調用"); return false; } }
MainActivity.java:
public class MyActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Button btn = (Button)findViewById(R.id.btn_my); btn.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(event.getAction() == KeyEvent.ACTION_DOWN) { Log.i("呵呵","監聽器的onKeyDown方法被調用"); } return false; } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode, event); Log.i("呵呵","Activity的onKeyDown方法被調用"); return false; } }
運行截圖:
結果分析: 從上面的運行結果,我們就可以知道,傳播的順序是: 監聽器--->view
組件的回調方法--->Activit
y的回調方法;返回值false
繼續傳播,true
終止傳播