1. 程式人生 > >自定義控制元件之觸控事件的傳遞

自定義控制元件之觸控事件的傳遞

層面優先順序:Activity-->ViewGroup-->View

1、dispatchTouchEvent方法:

每個View包括ViewGroup中都能重寫此方法,該方法是用來分發觸控事件的。是一個佈局中,觸控事件首先執行的的方法。如果dispatchTouchEvent返回值是true,代表觸控事件分發給本View的onTouchEvent。如果返回值是false,那麼觸控事件分發給本View的onInterceptEvent(如果是View,就沒有該方法,那麼事件就到此終止了)。

一般情況下,不建議重寫該方法。

2、Demo介紹,MyLinearLayout繼承了LinearLayout,MyTextView繼承了TextView,佈局如下圖


MyLinearLayout中,重寫了onInterceptTouchEvent和onTouchEvent(dispatchTouchEvent沒有重寫,這個比較容易理解,分析在第一點)。MyTextView中,重寫了onTouchEvent方法(View中沒有onInterceptTouchEvent)。

(1)情況一,MyLinearLayout裡的onInterceptTouchEvent返回預設值(false),MyTextView的onTouchEvent返回true。

觸控上面的MyTextView部分,結果如下


結論,onInterceptTouchEvent返回false的意思是把觸控事件往下傳遞給其子View(實際上先抵達子View的dispatchTouchEvent方法,預設返回true

),所以即是傳遞給MyTextView的onTouchEvent方法。首先是down從MyLinearLayout的onInterceptTouchEvent傳遞到MyTextView的onTouchEvent,發現onTouchEvent的返回值是true,意思就是說自己消費此觸控事件,不會往其父MyLinearLayout的onTouchEvent傳遞了。那麼接下來move和up都是按上面的形式傳遞。

(2)情況二,MyLinearLayout裡的onInterceptTouchEvent返回預設值(false),MyTextView的onTouchEvent返回預設值(false),MyLinearLayout裡的onTouchEvent返回true。

觸控上面的MyTextView部分,結果如下。


結論,MyLinearLayout的onInterceptTouchEvent返回false,down事件往下傳遞到MyTextView的onTouchEvent,由於此時false,沒有辦法自己消費此事件,那麼就往其父MyLinearLayout的onTouchEvent裡傳遞了,此時MyLinearLayout的onTouchEvent返回true,代表要自己消費此觸控事件,所以不會再繼續往上傳了。注意了,後面的move和up會繼續觸發,不過不會再分發給MyLinearLayout的onInterceptTouchEvent了(所以也不可能到MyTextView的onTouchEvent),而是直接到MyLinearLayout的onTouchEvent。(只要onTouchEvent返回true,up事件必然是在這裡完成的)。

(3)情況三,MyLinearLayout裡的onInterceptTouchEvent返回預設值(false),MyTextView的onTouchEvent返回預設值(false),MyLinearLayout裡的onTouchEvent返回false。觸控上面的MyTextView部分,結果如下。

結論,與情況二的區別在於MyLinearLayout的onTouchEvent返回false。down事件傳到MyLinearLayout的onTouchEvent,返回值是false,然後再往其父的onTouchEvent傳,其後的move和up事件都被onTouchEvent返回值是true的某個父類消費了,類似於情況二,中間的不會傳遞到。

(4)情況四,MyLinearLayout裡的onInterceptTouchEvent返回true,MyLinearLayout裡的onTouchEvent返回true。
觸控上面的MyTextView部分,結果如下。


結論,MyLinearLayout的onInterceptTouchEvent返回true,觸控事件不往子View裡傳了,而是傳給自己的onTouchEvent。down事件過來後,返回值是true,那麼就說明了它自己消費了此次的觸控事件,所以MyLinearLayout的dispatchTouchEvent分發的時候就不再往onInterceptTouchEvent分發了,所以後面的move和up都是直接傳到本View的onTouchEvent。

(5)情況五,MyLinearLayout裡的onInterceptTouchEvent返回true,MyLinearLayout裡的onTouchEvent返回false。

觸控上面的MyTextView部分,結果如下。


情況五就是情況三和情況四的結合。

--------------------------------------------------以下部分是觸控MyLinearLayout-------------------------------------------------------------

(6)情況六,MyLinearLayout的onInterceptTouchEvent返回false,MyLinearLayout裡的onTouchEvent返回true

結果如下:


結論,onInterceptTouchEvent無論返回true還是false,結果都是和上面一致。返回false就是給子View的onTouchEvent,由於沒有對MyTextView觸控,所以此時的子View可以理解為沒有,那就是本身。而返回true就是傳遞給本View的onTouchEvent。onTouchEvent返回值是true在前面已經分析過了。

(7)情況七,MyLinearLayout的onInterceptTouchEvent返回false,MyLinearLayout裡的onTouchEvent返回false

結果如下:


結論,onInterceptTouchEvent無論返回true還是false,結果都是和上面一致。分析如情況六。onTouchEvent返回值是false在前面已經分析過了。

相關推薦

定義控制元件觸控事件傳遞

層面優先順序:Activity-->ViewGroup-->View 1、dispatchTouchEvent方法: 每個View包括ViewGroup中都能重寫此方法,該方法是用來分發觸控事件的。是一個佈局中,觸控事件首先執行的的方法。如果dispatchTo

定義控制元件側滑關閉 Activity 控制元件

隔壁 iOS 的小夥伴有一個功能就是左手向右手一個慢動作,輕輕一劃就可以關閉介面,這種操作感覺還是很絲滑的,而且這還是 iOS 系統自帶的功能,由於 Android 手機早期是有 back 鍵,home 鍵 和選單鍵(現在大部分手機都只保留一個鍵了),所以 Android 是沒有這個功能的。現在

定義控制元件下載控制元件1(DownloadView1)

前段時間在乾貨集中營看到了兩個炫酷的下載按鈕:       可惜是隔壁 iOS 的孩子,怎麼辦,我也好喜歡,emmm,某該,只能自己模仿著實現一下了。先從第一個入手(第二個波浪效果暫時還不會)。 1 準備動作 寫過幾次自定義控制元件

定義控制元件 PasswordEditText(密碼輸入框)

前兩天在掘金上看到了一個驗證碼輸入框,然後自己實現了一下,以前都是繼承的 View,這次繼承了 ViewGroup,也算是嘗試了一點不同的東西。先看看最終效果: 事實上就是用將輸入的密碼用幾個文字框來顯示而已,要打造這樣一個東西我剛開始也是一頭霧水,不急,直接寫不會,我們可以採取曲線救

定義控制元件 Gamepad (遊戲手柄)

這段時間自己在復刻一個小時候玩過的小遊戲——魔塔,在人物操控的時候剛開始用的感覺 low low 的上下左右四個方向鍵,後來受王者農藥啟發,決定採用現在很多遊戲中的那種遊戲手柄,網上也有例子,不過最近自己對自定義控制元件很感興趣,決定自己擼一個,最後實現的效果是這樣的: 看到這樣

定義控制元件 SubmitBotton (提交按鈕)

在 Android 中我覺得除了實現很多功能性很強的需求之外,最吸引我的就是各種炫酷的自定義控制元件,但是自定義控制元件這個東西沒有辦法用一種固定的模式來講解,因為自定義控制元件都是根據需求來定製的。同時這也說明只要程式猿牛逼,就沒有實現不了的功能。 之前有看到一個效果: Android

定義控制元件固定Tab

在開發中我們通常用到固定的Tab,Tab的個數是可以動態配置的,但是不支援滑動,每個Tab均分佈局並且之間被一個豎線分割開,Tab底部是一條分割線。看到如下效果如下,Tab佈局、線條顏色都支援高度制定。這個Tab的難點在於首先Tab個數不固定,其次Tab豎線左右兩端沒有隻有相鄰的兩個才有,而且粗

wpf定義控制元件依賴屬性

  在wpf開發過程中,總會用到格式各樣的控制元件,但是原生控制元件遠遠不能滿足實際開發的需要,這時候wpf強大之處就能體現出來了。根據實際需求自定義各種不同的控制元件滿足不同的業務需求。 首先說需求吧: 一:根據某個bool值,控制一個圓形控制元件顯示或者不顯示某種顏色。 分析: 一:需

Android定義控制元件區域性圖片放大鏡--BiggerView

零、前言: 本文的知識點一覽 1.自定義控制元件及自定義屬性的寫法,你也將對onMesure有更深的認識 2.關於bitmap的簡單處理,及canvas區域裁剪 3.本文會實現兩個自定義控制元件:FitImageView(圖片自適應)和BiggerView(放大鏡),前者為後者作為鋪墊。 4.最後會

定義控制元件輪播圖的實現

public class BannerView extends RelativeLayout { private boolean startAndclose; private List<String> images = new ArrayList

【我的Android進階旅】定義控制元件使用ViewPager實現可以預覽的畫廊效果,並且定義畫面切換的動畫效果的切換時間

我們來看下效果 在這裡,我們實現的是,一個ViewPager來顯示圖片列表。這裡一個頁面,ViewPage展示了前後的預覽,我們讓預覽頁進行Y軸的壓縮,並設定透明度為0.5f,所有我們看到gif最後,左右兩邊的圖片有點朦朧感。讓預覽頁和主頁面有主從感。我們用分

Android定義控制元件仿汽車家下拉重新整理

關於下拉重新整理的實現原理我在上篇文章Android自定義控制元件之仿美團下拉重新整理中已經詳細介紹過了,這篇文章主要介紹錶盤的動畫實現原理 汽車之家的下拉重新整理分為三個狀態: 第一個狀態為下拉重新整理狀態(pull to refresh),在這個狀

定義控制元件組合式控制元件 下拉選擇框

自定義控制元件之組合式控制元件 下拉選擇框 文章目錄 自定義控制元件之組合式控制元件 下拉選擇框 零 組合控制元件下載 一 自定義控制元件思路 二 MainActivity核心程式碼 三 activity_main.xml

定義控制元件二階貝塞爾曲線方法詳解

前言:先膜拜一下啟艦大神,本想自己寫一篇關於貝塞爾曲線的文章,但無奈此大神寫的太6了 ,所以直接轉載 相關文章:《Android自定義控制元件三部曲文章索引》: http://blog.csdn.net/harvic880925/article/details/50995268從

定義控制元件文字繪製

paint與文字設定相關的方法如下 paint.setStrokeWidth(5);//畫筆寬度 paint.setColor(Color.RED);//設定顏色 paint.setAntiAlias(true);//抗鋸齒功能 p

Winform----定義控制元件背景半透明遮罩載入控制元件

先貼執行效果圖,原始碼點選這裡下載 1.新建自定義控制元件 2.實現功能 namespace UserControlLib { [ToolboxBitmap(typeof(ZhLoading))] public partial class ZhLoad

Android定義控制元件《折線圖的繪製》

金融軟體裡的行情分時圖,這是我們最常見的折線圖,當然了,折線圖的用途並不僅僅侷限於此,像一般在一定區間內,為了更好的能顯示出幅度的變化,那麼用折線圖來展示無疑是最符合效果的,當然了,網上也有很多的第

Android定義控制元件實現滑動選擇開關

前言:今天我們仿照著Google給我們提供的Switch控制元件來進行一次模仿,自己動手打造一個可以換滑動圖片以及背景的圖片。 -----------------分割線--------------- 先看一下google提供的Switc控制元件: 其實用法很簡單就當普通的

WPF定義控制元件列表滑動特效 PowerListBox

原文: WPF自定義控制元件之列表滑動特效 PowerListBox 列表控制元件是應用程式中常見的控制元件之一,對其做一些絢麗的視覺特效,可以讓軟體增色不少。 本人網上看過一個視訊,是windows phone 7系統上的一個App的列表滾動效果,效果非常炫 現在在WPF上用ListBox重現此效

WPF定義控制元件圖形解鎖控制元件 ScreenUnLock

原文: WPF自定義控制元件之圖形解鎖控制元件 ScreenUnLock ScreenUnLock 與智慧手機上的圖案解鎖功能一樣。通過繪製圖形達到解鎖或記憶圖形的目的。 本人突發奇想,把手機上的圖形解鎖功能移植到WPF中。也應用到了公司的專案中。 在建立ScreenUnLock之前,先來分析一下圖形解