android事件傳遞機制以及onInterceptTouchEvent()和onTouchEvent()詳解二之小秘與領導的故事

來源:互聯網
上載者:User

標籤:

總結的不是很好,自己也有點看不懂,正好現在用到了,研究了一個,再次總結,方便大家查看

總則:

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:textStyle="bold"            android:background="#FFFFFF"            android:textColor="#0000FF"/>   </com.touchstudy.LayoutView2></com.touchstudy.LayoutView1>
 

分析一:就上面布局,分析一下,如果不干擾他們各自的方法的傳回值,首先是根控制項LayoutView1的秘書1(onInterceptTouchEvent)收到通知(ACTION_down),她在想,啊,要不要通知根控制項的領導1(onTouchEvent)呢,恩,算了吧,這麼重要的領導1,太忙了,日理萬機啊,先往下通知吧,看下面有沒有人響應,然後直接發給LayoutView2的秘書2,秘書2想這幾天陪領導2太累了,想休息下,不告訴他吧,然後又直接下發MyTextView領導3,領導3層級不夠啊,沒有小秘啊,咋辦,自己收通知唄,然後處理,他想啊想,要不要去呢?真糾結,他給自己兩條路:

  1.自己去,return true,好,這一級級的返回結果,都知道他要去了,這就省事了,活動安排(ACTION_MOVE和ACTION_UP)來了,秘書1直接通知秘書2(為什麼不直接通知領導3呢,因為他閑領導3太醜,哈哈,開玩笑滴,領導絕對是英俊瀟洒,風流倜儻……,是因為不夠層級讓自己去通知啊),秘書2收到通知,再直接下發給領導3 ,然後領導3就happy去了,所以說啊,這管理是很嚴滴,一級一級往下分發,你下級的事,上面都知道,要小心嘍 ……

  2.自己不去,return false,唉,懶得去,向上級彙報,自己病了,秘書2一聽,唉,沒辦法,這隻有通知自家領導2了,叫醒領導2,問他去不去,領導2正好休息好,心情不錯,大笑一揮,去,好,向上面彙報,秘書1的通知來了, 有人問這裡還要不要秘書2過一遍呢,答案是否,因為秘書2隻過濾一遍,就是決定要不要通知領導(看來領導必須跟小秘搞好關係啊,不然關鍵時刻給你來一下子,你就完蛋了),一旦領導收到通知,秘書就不管了,秘書幹嘛去了,秘書打扮去了啊,晚上要陪領導啊,還不打扮的漂亮點,這不是給領導丟人嗎?

請看圖

 

 

分析二

如果把LayoutView2的onInterceptTouchEVent返回true會有神馬情況?

前面分析一樣,這裡只分析一點,既然領導2的小秘通知了領導,領導也決定去,那就沒你領導3什麼事了,領導3什麼都收不到,網上說會收到ACTION_CANCEL,我這裡沒測到,我覺得應該是什麼都收不到,因為ACTION_CACEL前提條件是你收到了ACTION_DOWN,並且在之後的時間,上級領導突然又要插手這件事了,(在onInterceptTouchEVent的ACTION_MOVE/UP的時候返回true,截斷)這個時候,就會通知下級取消這次事件,什麼時候會遇到這種情況呢,在listview滑動的時候,按住螢幕往上滑動的時候,如果用程式類比的話,就是在上一級控制項的onInterceptTouchEVent中ACTION_DOWN的時候返回false(向下級傳遞),然後在ACTION_UP的時候返回tue,截斷後續訊息,這種情況會收到ACTION_CANCEL

好吧,到此結束,該去洗澡了,關於具體的螢幕點擊事件的處理機制以及流程在以後的博文中整理!謝謝!

 

最後附上源碼地址 :     http://files.cnblogs.com/xiaoQLu/MotionEventTest.rar

android事件傳遞機制以及onInterceptTouchEvent()和onTouchEvent()詳解二之小秘與領導的故事

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.