android控件之間事件傳遞

 

public boolean dispatchTouchEvent(MotionEvent ev){}

用於事件的分發,Android中所有的事件都必須經過這個方法的分發,然後決定是自身消費當前事件還是繼續往下分發給子控件處理。返回true表示不繼續分發,事件沒有被消費。

 

public boolean onInterceptTouchEvent(MotionEvent arg0){}

用於事件的處理,返回true表示消費處理當前事件,返回false則不處理,交給子控件進行繼續分發。

 

public boolean onTouchEvent(MotionEvent arg0){}

負責事件的攔截,返回true的時候表示攔截當前事件,不繼續往下分發,交給自身的onTouchEvent進行處理。返回false則不攔截,繼續往下傳。

 

舉例說明三個方法之間的傳遞關系,加入界面如下圖:

傳遞關系如下:

例:Android Viewpage禁止滑動屏幕(如果是其他view可以自定義控件,然後重寫這幾個方法)

 

Android事件機制是從父View傳向子View的,可以去檢測你當前子View是不是在有可滑動控件等,決定事件是否攔截,但是這個麻煩,而且並不能解決所有的問題(必須檢測觸摸點是否在這個控件上面),其實有比較簡單的方法,在你嵌套的控件中註入ViewPager實例,然後在onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent裡面告訴父View,也就是ViewPager不要攔截該控件上的觸摸事件。

requestDisallowInterceptTouchEvent(true) ; true則禁止

 

 

子view中添加代碼一般如下:

public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
requestDisallowInterceptTouchEvent(false);
break;
}
}

當用戶按下的時候,我們告訴父組件,不要攔截我的事件(這個時候子組件是可以正常響應事件的),拿起之後就會告訴父組件可以阻止。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *