1. 程式人生 > >android原始碼---ViewGroup的dispatchTouchEvent()的原始碼分析

android原始碼---ViewGroup的dispatchTouchEvent()的原始碼分析

這裡寫圖片描述 貌似在LinearLayout RelativeLayout的dispatchTouchEvent()方法都在ViewGroup中。對於TextView的也是在View中。 ①當呼叫方法的時候,如果是ACTION_DOWN時,要清除原有的觸控的事件。 這裡寫圖片描述 ②對於cancelAndClearTouchTargets()方法,引數event不可能為null,因此重要的是for迴圈。然後呼叫dispatchTransformedTouchEvent()方法,並且傳遞的cancle為true.這個方法是處理觸控後view的平移的方法。 這裡寫圖片描述 ③對於平移的方法,因為傳遞過來的引數cancle是true。因此會呼叫下面劃橫線的方法。如果沒有子view,那麼就會呼叫父類的dispatchTouchEvent(),這樣就形成了遞迴。否則就會呼叫子類的dispatchTouchEvent()的方法。這樣進行判斷在子view中是否進行攔截。 這裡寫圖片描述

對於在View中的dispatchTouchEvent()方法,這裡也是對當前的onTouch()方法進行判斷,如果在onTouch()中返回了true.那麼就代表了處理了該事件。 這裡寫圖片描述 這裡寫圖片描述

④清除所有的觸控物件,也就是呼叫recycle()置空。 這裡寫圖片描述 ⑤接著還是看dispatchTouchEvent()方法。intercepted預設為false.呼叫onIntercepTouchEvent()方法進行判斷是否進行攔截。如果攔截就為true. 這裡寫圖片描述 ⑥如果cancled為false並且intercepted為false.也就是不是取消操作,也不是攔截操作,那麼就開始執行下面的程式碼。 這裡寫圖片描述

再這裡使用了倒序遍歷的方式,主要能找到最新加入的view。 這裡寫圖片描述 ⑦canViewReceivePointerEvents()方法,原意翻譯是能接受到指標事件的view,但是在原始碼中發現,就是找到是visible的view 這裡寫圖片描述 對於這個方法,主要是判斷觸控的點是否在view的範圍之內。也就是是否觸摸了當前的view。 這裡寫圖片描述 ⑧接著看dispatchTouchEvent()方法中,這時候的傳遞給dispatchTransformedTouchEvent()方法中cancel為false. 如果返回的是true,那麼就是已經被處理了。那麼就設定alreadyDispatchedToNewToudchTarget為true。 表明已經分發到觸控的目標。並且這個Boolean值在下面還是會被使用。 這裡寫圖片描述
⑨緊接著檢視dispatchTransformedTouchEvent()中的方法。這裡具體細節不太明白。但是大致還是將事件分發到子view中,返回是否處理的Boolean值,並且做相應的view矩陣變換。 這裡寫圖片描述 這裡寫圖片描述 ⑩在上面獲取的引數alreadyDispatchedToNewToudchTarget為true直接就返回已經處理。然後在這裡竟然又呼叫dispatchTransformTouchEvent()返回是否進行處理的程式碼。最終也是返回boolean值。 這裡寫圖片描述