Android的Touch事件分發機制簡單分析

相關Touch事件的方法

1、public boolean dispatchTouchEvent(MotionEvent ev)                ————事件分發方法,分發Event所調用

2、public boolean onInterceptTouchEvent(MotionEvent ev)    ————事件攔截方法,攔截Event所調用

3、public boolean onTouchEvent(MotionEvent event)       ————事件響應方法,處理Event所調用


擁有上述事件的類

1、Activity類(Activity及其各種繼承子類)

    dispatchTouchEvent()、onTouchEvent()

2、ViewGroup類(LinearLayout、FrameLayout、ListView等…..)

    dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()

3、View類(Button、TextView等…..)

    dispatchTouchEvent()、onTouchEvent()

需要特別注意一點就是ViewGroup中額外擁有onInterceptTouchEvent()方法,其他兩個方法爲這三種類所共同擁有


方法的簡單用途解析

我們可以發現這三個方法的返回值都爲boolean類型,其實它們就是通過返回值來決定下一步的傳遞處理方向。

1、dispatchTouchEvent()  ——用來分發事件所用

  該方法會將根元素的事件自上而下依次分發到內層子元素中,直到被終止或者到達最裏層元素,該方法也是採用一種隧道方式來分發。在其中會調用onInterceptTouchEvent()和onTouchEvent(),一般不會去重寫。

  返回false則不攔截繼續往下分發,如果返回true則攔截住該事件不在向下層元素分發,在dispatchTouchEvent()方法中默認返回false。

2、onInterceptTouchEvent()  ——用來攔截事件所用

  該方法在ViewGroup源代碼中實現就是返回false不攔截事件,Touch事件就會往下傳遞給其子View。

  如果我們重寫該方法並且將其返回true,該事件將會被攔截,並且被當前ViewGroup處理,調用該類的onTouchEvent()方法。

3、onTouchEvent()  ——用來處理事件

  返回true則表示該View能處理該事件,事件將終止向上傳遞(傳遞給其父View)

  返回false表示不能處理,則把事件傳遞給其父View的onTouchEvent()方法來處理




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