Android?NestedScrolling與分發機制?二

來源:互聯網
上載者:User

標籤:

    上篇轉載了 Android:30分鐘弄明白Touch事件分發機制

    這篇轉載 Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

    下篇,將對NestedScrolling相關的四個方法匯總分析!

然後再用二個Demo分別對以前5.0之前的View事件分發與NestedScrolling使用進行不同的實現!

(轉載二)
    Android中觸摸事件傳遞過程中最重要的是dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()方法。這個是困擾初學者的問題之一,我開始也是。這裡記錄一下dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()的處理過程,以供記憶。

    dispatchTouchEvent是處理觸摸事件分發,事件(多數情況)是從Activity的dispatchTouchEvent開始的。執行

super.dispatchTouchEvent(ev),事件向下分發。

    onInterceptTouchEvent是ViewGroup提供的方法,預設返回false,返回true表示攔截。

    onTouchEvent是View中提供的方法,ViewGroup也有這個方法,view中不提供onInterceptTouchEvent。view中預設返回true,表示消費了這個事件。
View裡,有兩個回呼函數 :

1 public boolean dispatchTouchEvent(MotionEvent ev);    

2 public boolean onTouchEvent(MotionEvent ev);   

ViewGroup裡,有三個回呼函數 :

3 public boolean dispatchTouchEvent(MotionEvent ev);    

4 public boolean onInterceptTouchEvent(MotionEvent ev);    

5 public boolean onTouchEvent(MotionEvent ev);  

在Activity裡,有兩個回呼函數 :

6 public boolean dispatchTouchEvent(MotionEvent ev);    

7 public boolean onTouchEvent(MotionEvent ev);    

    Android中預設情況下事件傳遞是由最終的view的接收到,傳遞過程是從父布局到子布局,也就是從Activity到ViewGroup到View的過程,預設情況,ViewGroup起到的是透傳作用。Android中事件傳遞過程(按箭頭方向)如,圖片來自[qiushuiqifei],謝謝[qiushuiqifei]整理。

    觸摸事件是一連串ACTION_DOWN,ACTION_MOVE..MOVE…MOVE、最後ACTION_UP,觸摸事件還有ACTION_CANCEL事件。事件都是從ACTION_DOWN開始的,Activity的dispatchTouchEvent()首先接收到ACTION_DOWN,執行super.dispatchTouchEvent(ev),事件向下分發。

    dispatchTouchEvent()返回true,後續事件(ACTION_MOVE、ACTION_UP)會再傳遞,如果返回false,dispatchTouchEvent()就接收不到ACTION_UP、ACTION_MOVE。

下面的幾張圖參考自[eoe]

 

                 圖1.ACTION_DOWN都沒被消費                                

                                                                  圖2-1.ACTION_DOWN被View消費了 

                                     

 

                                                   圖2-2.後續ACTION_MOVE和UP在不被攔截的情況下都會去找VIEW

                              

                                                                    圖3.後續的被攔截了

 

                              

                                                                       圖4ACTION_DOWN一開始就被攔截

android中的Touch事件都是從ACTION_DOWN開始的:

單手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP

多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.



來自為知筆記(Wiz)

Android?NestedScrolling與分發機制?二

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.