Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android事件之onInterceptTouchEvent,dispatchTouchEvent,onTouchEvent,requestDisallowInterceptTouchEvent

android事件之onInterceptTouchEvent,dispatchTouchEvent,onTouchEvent,requestDisallowInterceptTouchEvent

編輯:關於Android編程

android 的這個事件的分發傳遞,處理的解決方式,
實質應該是 java設計模式裡面的 責任鏈模式了。

在這裡,想用最少的話,最通俗易懂的方式記錄

View的方法
// 事件分發,默認返回false 
public boolean dispatchTouchEvent(MotionEvent event) 

// 事件處理,默認返回false 
public boolean onTouchEvent(MotionEvent event) 
ViewGroup的方法
// 事件分發,默認返回false 
public boolean dispatchTouchEvent(MotionEvent event) 

// 事件處理,默認返回false 
public boolean onTouchEvent(MotionEvent event)  

// 攔截默認,默認返回false
// 返回true 就不會往下傳遞事件,自己onTouchEvent處理
// 返回false 向下傳遞事件
public boolean onInterceptTouchEvent(MotionEvent ev)

當觸發一個事件,父布局會優先得到這個事件進行分發,也就是一般的

單獨View (如果設置了OnTouchListener)

dispatchEvent–setOnTouchListener–onTouchEvent

單獨看ViewGroup (如果設置了OnTouchListener)

dispatchTouchEvent –onInterceptTouchEvent–setOnTouchListener– onTouchEvent

3.ViewGroup 嵌套View
也就是我們平常最有用最關心的
前面說了底層的View能夠接收到這次的事件有一個前提條件:在父層級允許的情況下。假設不改變父層級的dispatch方法,在系統調用底層onTouchEvent之前會先調用父View的onInterceptTouchEvent方法判斷,父層View是不是要截獲本次touch事件之後的action。
所以下面的這個東西一定要分清楚,這個還是很重要的,很多人很模糊,或者說很ran

事件的分發上的執行順序:
(父)dispatchTouchEvent

(父)onInterceptTouchEvent

(子)dispatchEvent

事件的處理執行順序
(子)onTouchEvent

(父)onTouchEvent

4 如果父View 和 子View都設置的點擊事件相應的問題了

其實是都可以響應的,不多說,ListView中的adapter item布局都寫的多了。

5 requestDisallowInterceptTouchEvent

requestDisallowInterceptTouchEvent 是ViewGroup類中的一個公用方法
Called when a child does not want this parent and its ancestors to intercept touch events with ViewGroup.onInterceptTouchEvent(MotionEvent).
This parent should pass this call onto its parents. This parent must obey this request for the duration of the touch (that is, only clear the flag after this parent has received an up or a cancel.

實際的應用中,可以在子view的ontouch事件中注入父ViewGroup的實例,並調用requestDisallowInterceptTouchEvent去阻止父view攔截點擊事件
原來listView 第一行, 嵌套ViewPager ,其他行嵌套別的中就需要用到這個

需要在子布局中操作,父布局不攔截自身事件

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {

        //讓父類不攔截觸摸事件就可以了。
        this.getParent().requestDisallowInterceptTouchEvent(true); 
        return super.dispatchTouchEvent(ev);

    }

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved