日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android】Touch事件分发

發布時間:2025/7/14 Android 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android】Touch事件分发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題外話:

/*** A ViewGroup is a special view that can contain other views* (called children.) The view group is the base class for layouts and views* containers. This class also defines the* android.view.ViewGroup.LayoutParams class which serves as the base* class for layouts parameters.

一個ViewGroup是一個可以包含其他view的特別的View(是View的子類),ViewGroup是各個Layout和View組件的基類,這個類還定義了LayoutParams類來指定這個基類的布局參數。

?

正題:

之所以先了解一下ViewGroup,是因為ViewGroup是了解一個界面組織的基本元素,只有知道這個元素,我們才好描述Touch事件的分發。關于Touch事件的分發,很多人都做過研究,比如Android中OnTouch事件的研究:

在觸發OnTouch事件的時候Android的GroupView會調用如下三個函數:

1 public boolean dispatchTouchEvent(MotionEvent ev) 用于事件的分發 2 public boolean onInterceptTouchEvent(MotionEvent ev) 用于事件的攔截 3 public boolean onTouchEvent(MotionEvent ev) 處理事件

當然我們可以在容器類中如繼承自LinearLayout的類中重寫這三個方法。而繼承View類的子類只能重寫dispatch和onTouchEvent兩個方法。當點擊后這三個方法相繼執行。

自己寫了一個TextView子類MyTextView和LinearLayout子類MyLinearLayout,TextView包含在LinearLayout中。

  當點擊MyTextView時,程序會先進入到LinearLayout的dispatchTouchEvent中,這個類必須調用super.dispatchTouchEvent(ev);?否在后面的兩個方法無法觸發,所以傻蛋發現這個方法根本沒有必要重寫,因為框架是在super.dispatchTouchEvent(ev);中來調用onInterceptTouchEvent和onTouchEvent方法的,所以手動的設置dispatchTouchEvent的返回值是無效的,除非你不想讓框架觸發這兩個方法。

? ? ?當執行完dispathTouchEvent后會執行onInterception方法,如果返回為true,這表示MyLinearLayout把這個Touch事件攔截了,就會執行自己的OnTouch方法。如果為false則表示不攔截,此事件會分發到把事件傳遞給它的子控件MyTextView中。

? ? ?當事件傳遞到MyTextView后,會執行dispatchTouchEvent,然后會執行onTouchEvent。當在MyTextView中的onTouchEvent返回為false的話,當執行完onTouchEvent中的事件后,事件會再分發給MyLinearLaytout,執行LinearLayout的onTouchEvent。

博客作者(傻蛋?)使用一個LinearLayout和一個TextView來做實驗,我們可以得出如下的結論:

1)事件的初始觸發者是父組件(LinearLayout),父組件有權決定是分發這個事件還是攔截這個事件;

2)如果父組件分發這個事件,則子控件會收到這個事件,子控件調用onTouchEvent方法處理事件,如果onTouchEvent返回的是false,則事件還會交給父組件處理。

總結論是:

Android的觸摸事件分發是從最上層的Activity開始的,然后dispatch到子View,當分發到觸發事件的View時,再逐層往回調用onTouchEvent函數,下面是實例代碼。

更明白一點:

Android 消息隊列的分發流程是:Activity? ->? ViewGroup1? -> ViewGroup1的直接子ViewGroup –> ××××××? -> 葉子View

消息處理流程,從子到父,如果消息處理一直返回的是 false。則一直是從子到父的依次處理。處理到沒有可以處理的人了,或者返回了true到此為止。

(還需要繼續,自己實驗,自己研究源碼)

轉載于:https://www.cnblogs.com/lqminn/archive/2012/09/25/2701171.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【Android】Touch事件分发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。