1. 程式人生 > >淺談Android事件分發機制

淺談Android事件分發機制

在Android實際開發過程中經常會遇到View之間的滑動衝突,如ScrollView與Listview、RecyclerView之間的巢狀使用。在很好的解決此類問題之前,我們應深入的瞭解Android事件響應機制。

1.事件響應機制的預備知識

在深入瞭解Android事件響應機制前,一些預備知識我們應該有所瞭解。

1.1 onTouch是優先於onClick執行,事件傳遞的順序是先經過onTouch,再傳遞到onClick。

1.2 Android中的事件onClick、onLongClick、onScroll等,都是由多個Touch事件(一個ACTION_DOWN,多個ACTION_MOVE,一個ACTION_UP)組成。

1.3 Android事件響應機制是“由外到內”分發、“由內到外”處理的形式實現的。

1.4 MotionEvent物件的四種狀態

MotionEvent.ACTION_DOWN:手指按下螢幕的瞬間。

MotionEvent.ACTION_MOVE:手指在螢幕上移動

MotionEvent.ACTION_UP:手指離開螢幕瞬間

MotionEvent.ACTION_CANCEL:取消手勢

2.Android事件處理的三個重要函式

Android事件分發機制主要由“事件分發”—>“事件攔截”—>“事件響應”這三步來進行邏輯控制的。本文也將從這三步對應的函式來分析。

2.1 事件分發:public boolean dispatchTouchEvent(MotionEvent ev)

當監聽到有觸發事件時,首先由Activity進行捕獲,然後事件就進入事件分發的流程。Activity本身沒有事件攔截,從而將事件傳遞給最外層的View的dispatchTouchEvent(MotionEvent ev)方法,該方法將對事件進行分發。

  • return true : View消費所有事件。
  • return false :停止分發,交由上層控制元件的onTouchEvent方法進行消費,如果本層控制元件是Activity,那麼事件將被系統消費、處理。
  • super.dispatchTouchEvent(ev): 將事件交由本層的事件攔截onInterceptTouchEvent方法處理。
2.2 事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev)
  • return true: 對事件攔截,交由本層的onTouchEvent進行處理。
  • return false: 不攔截,分發到子View,由子View的dispatchTouchEvent方法處理。
  • super.onInterceptTouchEvent(ev):預設表示事件攔截,交由本層的onTouchEvent進行處理。
2.3 事件響應:public boolean onTouchEvent(MotionEvent ev)
  • return true: 表示onTouchEvent處理完事件後消費了此次事件。
  • return false: 不響應事件,不斷的傳遞給上層的onTouchEvent方法處理,直到某個View的onTouchEvent返回true,則認為該事件被消費。如果到最頂層View還是返回false,那麼該事件不消費,將交由Activity的onTouchEvent進行處理。
  • return: super.onTouchEvent,不響應事件,結果與return返回false一樣。

綜上所述,我們可以總結出如下流程圖:

這裡寫圖片描述

結合上面的理解,我們再來看看Touch事件傳遞機制流程圖

Touch事件傳遞機制流程圖

3. 總結

通過上面的敘述,相信大家對Android的分發機制有了初步的理解。為了加深大家的理解,下面做個簡單的總結。

  1. ViewGroup預設不攔截任何事件。
  2. 點選事件的分發過程如下:dispatchTouchEvent—>onTouchListener的OnTouch方法—>onTouchEvent—>onClickListener的onClick方法。從而也可以看出onTouch優先於onClick執行。
  3. 子View可以通過使用getParent().requestDisallowInterceptTouchEvent(true),阻止ViewGroup對其MOVE或UP事件進行攔截。
  4. 一個點選事件產生後,傳遞過程是:Activity—>Window—>View。頂級View接受到事件後,就會按照上面的規則去分發事件。

相關推薦

Android事件分發機制

在Android實際開發過程中經常會遇到View之間的滑動衝突,如ScrollView與Listview、RecyclerView之間的巢狀使用。在很好的解決此類問題之前,我們應深入的瞭解Android事件響應機制。 1.事件響應機制的預備知識 在深入瞭解A

Android 事件分發機制(一)

get touch 需要 傳遞 cimage android ges 常見 滑動 在上一篇文章中,淺談Android 事件分發機制(一),簡要分析了一下事件分發機制的原理,總結一下就是事件層層傳遞,直到被消費,原理看似簡單,但是在實際使用過程中,場景各不相同,復雜程度也就因

android 事件分發機制

cnblogs instance 1.0 必須 div called tool per 測試環境 我們通過代碼來分析 package im.weiyuan.com.viewutils; import android.content.Intent; import

Android 事件分發機制 圖解

ack 理解 cnblogs png ont tor 自己的 block ans 在Android 開發中事件分發是比較重要的,也是比較難理解的,之前看過這方面的東西,以為自己弄懂了,也就沒太註意,最近面試呢,想著肯定要問到這一塊的東西,回顧的時候發現

從小白角度探索Android事件分發機制

https 事件 很好 tar 上班 bsp 備份 http nbsp 今早來上班時看到郭神這邊文章超贊,劇情很好引人入勝,特此備份! https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650244386&

Android事件分發機制

前言 Android事件分發機制是Android開發者必須瞭解的基礎 網上有大量關於Android事件分發機制的文章,但存在一些問題:內容不全、思路不清晰、無原始碼分析、簡單問題複雜化等等 今天,我將全面總結Android的事件分

Android事件分發機制以及滑動衝突處理

轉載請註明出處:http://blog.csdn.net/u013038616/article/details/50733811 方便日後的檢視與交流,將學習與實踐總結如下。 一、Android事件傳遞分析 1、ViewGroup中事件分發機制相關的方法 a、dispatchTo

圖解 Android 事件分發機制 和 handler 機制

在Android開發中,事件分發機制是一塊Android比較重要的知識體系,瞭解並熟悉整套的分發機制有助於更好的分析各種點選滑動失效問題,更好去擴充套件控制元件的事件功能和開發自定義控制元件,同時事件分發機制也是Android面試必問考點之一,如果你能把下面的一些事件分發圖當場畫出來肯定加分不少。廢

進階必備-Android事件分發機制

一、簡介 或許你會問,“為什麼我一定要知道View的事件分發機制?”。因為我們在實際開發的過程中,經常會遇到多層的View互相巢狀以後,對某一個View進行滑動的時候,特別不靈敏,甚至於沒法滑動。這種滑動衝突的解決需要我們清楚的掌握View的事件分發機制。那下面我們詳細的講解下Vie

Android事件分發機制原始碼分析之Activity篇

在之前的事件分發分析中,曾提及到View的事件是由ViewGroup分發的,然而ViewGroup的事件我們只是稍微帶過是由Activity分發的。而我們知道,事件產生於使用者按下螢幕的一瞬間,事件生成後,經過一系列的過程來到我們的Activity層,那麼事件是怎樣從Activity傳遞

原始碼角度再看Android事件分發機制

基礎瞭解 MotionEvent 所謂點選事件分發,其實就是對MotionEvent分發。當一個MotionEvent產生了以後,系統需要把這個事件傳遞給一個具體的View,而這個傳遞的過程就是分發過程。 三種主要事件Action package andro

Android事件分發機制一 系統預設機制

1.為什麼要了解Android事件機制? 背景:我在做Android專案的時候遇到一個Activity->Fragment->ScrollView->Button這樣的巢狀關係,當一切都準備就緒,程式啟動後點擊Button的時候系統異常崩潰了,騰訊Bugl

Android事件分發機制2--自定義事件分發

還記得第一篇文章我們要解決的問題嗎? java.lang.IllegalArgumentException Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.ch

android事件分發機制

View事件分發機制時間一久就容易忘記,趁著國慶把這個知識點捋一遍,加深印象。 android控制元件都繼承自View和ViewGroup,其實ViewGroup也是繼承自View,只是由於ViewGroup是View的集合,一些方法有自己的獨特實現而已。 一、View事

Android 事件分發機制總結篇

一、前言 事件分發是基礎的知識點,開發中會經常遇到,平時開發只是為了解決問題,片面的理解,不夠深入,不成體系。這兩天有點時間,從 View,ViewGroup 到 Activity 體系的學習總結一下。 二、View 事件 我們知道view事件處理順序是(Down,Mo

Android事件分發機制詳解

概述   眾所周知,Android事件分發機制是Android知識體系中的重點也是難點。說白了,要學好Android,事件分發機制是無論如何也繞不過去的。   也許你會問,Android事件分發機制那麼重要,我怎麼沒用過呢?   當你被不同item的側滑刪除衝突

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(上)-郭霖

其實我一直準備寫一篇關於Android事件分發機制的文章,從我的第一篇部落格開始,就零零散散在好多地方使用到了Android事件分發的知識。也有好多朋友問過我各種問題,比如:onTouch和onTouchEvent有什麼區別,又該如何使用?為什麼給ListView引入了一

Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(下)-郭霖

記得在前面的文章中,我帶大家一起從原始碼的角度分析了Android中View的事件分發機制,相信閱讀過的朋友對View的事件分發已經有比較深刻的理解了。 還未閱讀過的朋友,請先參考 Android事件分發機制完全解析,帶你從原始碼的角度徹底理解(上) 。 那麼今天我們將繼

關於Android事件分發機制的巨集觀理解(簡單)

我儘量不打錯別字,用詞準確,不造成閱讀障礙。 之所以說是巨集觀,是因為我不會寫demo,一步步截圖給你看,我會拿原始碼然後剔除暫時用不到的部分,讓你從大脈絡上理解事件分發機制,這樣你會發現,很簡單。 首先在腦海中應該有一個例子,一個LinearLayout裡

Android事件分發機制:基礎篇:最全面、最易懂

如何提升安卓水平?安卓開發者必須瞭解的事件分發機制。 最全面、最易懂的形式來講解Android事件分發機制。 0. 前言 鑑於安卓分發機制較為複雜,故分為多個層次進行講解,分別為基礎篇、實踐篇與高階篇。 (一)基礎篇:從基本概念入手,介紹了分發機制中的核心方法,通過分析其核心邏輯,總結其事件分發機制。 (