之前寫過一個小結 http://www.cnblogs.com/xiaoQLu/archive/2011/03/26/1996344.html
總結的不是很好,自己也有點看不懂,正好現在用到了,研究了一個,再次總結,方便大家查看
總則:
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