1. 程式人生 > >onInterceptTouchEvent和onTouchEvent呼叫時序

onInterceptTouchEvent和onTouchEvent呼叫時序

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截,Android這麼設計的想法也很好理解,由於ViewGroup會包含若干childView,因此需要能夠統一監控各種touch事件的機會,因此純粹的不能包含子view的控制元件是沒有這個方法的,如LinearLayout就有,TextView就沒有。 

onInterceptTouchEvent()使用也很簡單,如果在ViewGroup裡覆寫了該方法,那麼就可以對各種touch事件加以攔截。但是如何攔截,是否所有的touch事件都需要攔截則是比較複雜的,touch事件在onInterceptTouchEvent()和onTouchEvent以及各個childView間的傳遞機制完全取決於onInterceptTouchEvent()和onTouchEvent()的返回值。並且,針對down事件處理的返回值直接影響到後續move和up事件的接收和傳遞。 

關於返回值的問題,基本規則很清楚,如果return true,那麼表示該方法消費了此次事件,如果return false,那麼表示該方法並未處理完全,該事件仍然需要以某種方式傳遞下去繼續等待處理。

SDK給出的說明如下:

·  You will receive the down event here.

·  The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.

·  For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().

·  If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.

由於onInterceptTouchEvent()的機制比較複雜,上面的說明寫的也比較複雜,總結一下,基本的規則是:

1.       down事件首先會傳遞到onInterceptTouchEvent()方法

2.       如果該ViewGroup的onInterceptTouchEvent()在接收到down事件處理完成之後return false,那麼後續的move, up等事件將繼續會先傳遞給該ViewGroup,之後才和down事件一樣傳遞給最終的目標view的onTouchEvent()處理。

3.       如果該ViewGroup的onInterceptTouchEvent()在接收到down事件處理完成之後return true,那麼後續的move, up等事件將不再傳遞給onInterceptTouchEvent(),而是和down事件一樣傳遞給該ViewGroup的onTouchEvent()處理,注意,目標view將接收不到任何事件。

4.       如果最終需要處理事件的view的onTouchEvent()返回了false,那麼該事件將被傳遞至其上一層次的view的onTouchEvent()處理。

5.       如果最終需要處理事件的view 的onTouchEvent()返回了true,那麼後續事件將可以繼續傳遞給該view的onTouchEvent()處理。

轉自http://blog.csdn.net/ddna/article/details/5473293


相關推薦

onInterceptTouchEventonTouchEvent呼叫時序

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截,Android這麼設計的想法也很好理解,由於ViewGroup會包含若干c

Android中dispatchTouchEvent,onInterceptTouchEventonTouchEvent的區別

dispatchTouchEvent:決定了事件是否繼續分發下去和是否響應事件,false:繼續分發,true:不繼續分發,此次事件到此結束,也不會有任何控制元件執行onTouchEvent方法。 onInterceptTouchEvent:決定了是否攔截該事件,false:不攔截,true:攔

Android中的dispatchTouchEvent()、onInterceptTouchEvent()onTouchEvent()

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

Android-onInterceptTouchEvent()onTouchEvent()總結

老實說,這兩個小東東實在是太麻煩了,很不好懂,我自己那api文件都頭暈,在網上找到很多資料,才知道是怎麼回事,這裡總結一下,記住這個原則就會很清楚了: 1、onInterceptTouchEvent()是用於處理事件(類似於預處理,當然也可以不處理)並改變事件的傳遞方向

dispatchTouchEvent,onUserInteraction,onTouchEvent 呼叫時序(按鍵監聽函式呼叫過程)

一、只有一個Activity時:一次拇指點選事件(包括ACTION_DOWN,ACTION_UP),呼叫時序如下: dispatchTouchEvent onUserInteraction onTouchEvent (ACTION_DOWN) dispatchTo

c理解提高(3)程式的記憶體四區模型函式呼叫模型

程式的記憶體四區模型 記憶體四區的建立流程 流程說明 1、作業系統把物理硬碟程式碼load到記憶體 2、作業系統把c程式碼分成四個區 3、作業系統找到main函式入口執行   各區元素分析 函式呼叫模型 基本原理

C# 委託的同步呼叫非同步呼叫--抓住重點

委託的Invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。 同步呼叫的例子: using System; using System.Threading; public delegate int AddHandl

超時呼叫(setTimeout)間歇呼叫(setInterval)

1.超時呼叫 console.log(1); var timeouId = setTimeout('console.log(12)', 2000); // 不會阻塞,而是在多長時間後將此任務新增到任務佇列,然後任務佇列根據新增進來任務的先後順序進行執行,故此處不一定是2s後執行。第一個引

原 .NET/C# 反射的的效能資料,以及高效能開發建議(反射獲取 Attribute 反射呼叫方法)

  大家都說反射耗效能,但是到底有多耗效能,哪些反射方法更耗效能;這些問題卻沒有統一的描述。    本文將用資料說明反射各個方法和替代方法的效能差異,並提供一些反射程式碼的編寫建議。為了解決反射的效能問題,你可以遵循本文采用的各種方案。    本文內容    反射各方法的效能資料    反射的高效能開發建議 

android事件之onInterceptTouchEvent,dispatchTouchEvent,onTouchEvent,requestDisallowInterceptTouchEvent

android 的這個事件的分發傳遞,處理的解決方式, 實質應該是 java設計模式裡面的 責任鏈模式了。 在這裡,想用最少的話,最通俗易懂的方式記錄 View的方法 // 事件分發,預設返回false public boolean dispatchTouc

Spark-Sql整合hive,在spark-sql命令spark-shell命令下執行sql命令整合呼叫hive

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【PHP】靜態方法呼叫非靜態方法靜態呼叫非靜態方法程式碼解讀

static 關鍵字用來修飾屬性、方法,稱這些屬性、方法為靜態屬性、靜態方法。 在類的靜態方法中是不能直接以$this->test()的方式呼叫非靜態方法的。還有框架中靜態的呼叫非靜態方法是怎麼回事??? 。。。 算了,不知道說啥 具體為啥看程式碼註釋: <?ph

onClick onTouch onTouchEvent呼叫順序

通過原始碼檢視: View – dispatchTouchEvent方法中    可以看出:  onTouchListener的介面的優先順序是要高於onTouchEvent的,假若onTouchListener中的onTouch方法返回true,  表示此次

如何把握好 transition animation 的時序,創作描邊按鈕特效

效果預覽 線上演示 按下右側的“點選預覽”按鈕可以在當前頁面預覽,點選連結可以全屏預覽。 https://codepen.io/comehope/pen/mKdzZM 可互動視訊教程 此視訊是可以互動的,你可以隨時暫停視訊,編輯視訊中的程式碼。 請用 chrome, safari, e

【Java虛擬機器】棧幀方法呼叫

棧幀和方法呼叫 執行時棧幀結構 區域性變量表 運算元棧 動態連線 返回地址 方法呼叫 解析 分派 靜態分派 動態分配 虛擬機器動態分配的實現

關於std::enable_shared_from_this 的繼承 shared_from_this呼叫崩潰的解析

enable_shared_from_this的由來 在智慧指標的使用過程中我們會遇到這樣一種情況,我們在類的成員函式呼叫某一個函式,而該函式需要傳遞一個當前物件的智慧指標作為引數時,我們需要能夠在成員函式中獲得自己的智慧指標。在多執行緒程式設計中也存在這樣的應用,如果我們的執行緒函式繫結的是一個

JS實現貪吃蛇—重點理解原型呼叫函式的沙箱

要點: 1.通過為建構函式的原型物件新增屬性或者方法,可以實現資料共享,節省記憶體空間,不需要每次重新定義。如果建構函式中的屬性或者方法跟原型物件中衝突,以建構函式為準,因為原型物件就是建立在建構函式的基礎之上的。 注意瀏覽器中使用的例項物件中的原型__proto__(兩個英文狀態下的下劃線

關於Activity中onStoponPause呼叫時機的各種誤解

原始碼 : https://github.com/w-g-b/ActivityReview 正確結果 假設當前的FirstActivity為A,要呼叫A的onPause方法而不呼叫onStop方法   1. 在AndroidManifest檔案中,將

JAVA中superthis呼叫建構函式

this 和super在建構函式中只能有一個,且都必須是建構函式當中的第一行。 super關鍵字,子類可以通過它呼叫父類的建構函式。 1、當父類的建構函式是無參建構函式時,在子類的建構函式中,就算不寫super()去呼叫父類的建構函式,編譯器不會報錯,因為編譯器

Java架構學習(四十)SpringCloud基礎&網站架構演變&微服務架構概述&SpringCloud概述&服務註冊與服務發現&搭建註冊中心Euraka&restfegin呼叫原理

一、網站架構演變過程 微服務架構 為什麼出現了SpringCloud 網站架構模式: 單點應用---->分散式系統面向於服務架構(SOA)體系 webservice---->微服務架構 web專案三層架構 如果在網際網路公司中,使用傳統架構技術