歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android事件傳遞機制以及onInterceptTouchEvent()和onTouchEvent()總結

Android事件傳遞機制以及onInterceptTouchEvent()和onTouchEvent()總結

日期:2017/3/1 9:49:31   编辑:Linux編程

老實說,這兩個小東東實在是太麻煩了,很不好懂,我自己那api文檔都頭暈,在網上找到很多資料,才知道是怎麼回事,這裡總結一下,記住這個原則就會很清楚了:

1、onInterceptTouchEvent()是用於處理事件(類似於預處理,當然也可以不處理)並改變事件的傳遞方向,也就是決定是否允許Touch事件繼續向下(子控件)傳遞,一但返回

True(代表事件在當前的viewGroup中會被處理),則向下傳遞之路被截斷(所有子控件將沒有機會參與Touch事件),同時把事件傳遞給當前的控件的onTouchEvent()處理;

返回false,則把事件交給子控件的onInterceptTouchEvent()

2、onTouchEvent()用於處理事件,返回值決定當前控件是否消費(consume)了這個事件,也就是說在當前控件在處理完Touch事件後,是否還允許Touch事件繼續向上(父控

件)傳遞,一但返回True,則父控件不用操心自己來處理Touch事件。返回true,則向上傳遞給父控件(注:可能你會覺得是否消費了有關系嗎,反正我已經針對事件編寫了處理代

碼?答案是有區別!比如ACTION_MOVE或者ACTION_UP發生的前提是一定曾經發生了ACTION_DOWN,如果你沒有消費ACTION_DOWN,那麼系統會認為ACTION_DOWN沒

有發生過,所以ACTION_MOVE或者ACTION_UP就不能被捕獲。)

源碼地址

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2014年資料/1月/3日/Android事件傳遞機制以及onInterceptTouchEvent()和onTouchEvent()總結

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

總則:

1.onInterceptTouchEvent中有個Intercept,這是什麼意思呢?她叫攔截,你大概知道她作用了吧,她就是你的親親小秘書,有什麼事,先找秘書,秘書來決定這個事要不要你親自處理,既然是秘書,是不是每個人都能有呢?當然不是,這個秘書只是viewgroup的,所以只有繼承viewgroup的控件才有,那些textview啊button啊什麼的,肯定是沒有的,為什麼?因為他級別不夠(繼承自view),是不能有秘書滴,注意,如果本級領導決定去的話,那後面的通知就不經過這一級的小秘了,直接發領導。

2.事件的傳遞順序,依次發生的是ACTION_DOWN從父控件傳向子控件,然後是ACTION_MOVE(可能出現,也可能不出現),最後是ACTION_UP,注意是按順序從父控件傳向子控件,手機上ACTION_MOVE和ACTION_UP基本是都會出現的,是因為手機的傳感器很敏感,但是模擬器就不一樣,如果沒有滑動,是不會出現action_MOVE的,所有的事件,ACTION_DOWN、ACTION_MOVE和ACTION_UP都首先發自根控件(布局文件中最外面一層)的onInterceptTouchEvent中,也就是說,每一個控件都首先會收到onInterceptTouchEvent事件(當然你必須有這個能力收到,原因看上面)

3.有小秘了,有事件了,那就該有領導了,onTouchEvent就是領導了,是處理具體的事件的,領導會首先收到小秘發的ACTION_DOWN事件,領導一看,(1)哇,小秘發的來的,趕緊瞅瞅,晚上是不是有什麼活動,一看,還真有活動,又可以帶小秘一起出去high了,過瘾,告訴小秘(return true),參加晚上的活動,然後上級小秘會接著把活動的具體安排(ACTION_MOVE和ACTION_UP)也發過來,都由這個領導處理(注意,具體活動是上級小秘直接通知下級領導(OnTouchEvent)的,這裡不再需要下級小秘過濾了,因為小秘打扮去了,晚上要陪領導活動呢),其他領導呢,只能望洋興歎了

(2)如果領導看了,發現不是出去happy的事,這心情郁悶的,又不能跟小秘一起了,這尼瑪的,還去個毛啊!不去了!!!告訴小秘呗(return false)不處理,然後小秘就會向上級(父控件)匯報,然後就由上級領導來處理。神馬?上級領導不處理,靠,那好吧,都交給他們的祖宗(View)去,查看view源碼,你會發現,一樣的,如果接受事件,就返回true,接著處理ACTION_MOVE和ACTION_UP,沒處理,就返回false,到祖宗這一級了,如果都沒人處理,那沒辦法,這個事件就此消失了,准備處理下一個

<?xml version="1.0" encoding="utf-8"?>
<com.touchstudy.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.touchstudy.LayoutView2
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<com.touchstudy.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv"
android:text="AB"
android:textSize="40sp"
android:text
android:background="#FFFFFF"
android:textColor="#0000FF"/>
</com.touchstudy.LayoutView2>
</com.touchstudy.LayoutView1>

Copyright © Linux教程網 All Rights Reserved