android開發過程中複雜混合控制項的難點之一的就是事件衝突。我們知道在處理事件衝突中,最重要的方法是:dispatchtouchevent(),onintercepttouchevent(),ontouchevent(),通過作用這三個方法,我們可以達到事件的分發、攔截、消費的效果。在activity(無onintercepttouchevent()),viewgroup,view中,根據返回值boolean型別,完成了事件的一系列過程。
從**的角度講:activity是a,技術總監,viewgroup是b,leader,view是c,組員,dispatchtouchevent方法進行了事件向上傳遞的攔截,onintercepttouchevent進行了事件向下的攔截,ontouchevent進行了事件的消費。
根據返回值的不同,我們可以做出如下判斷:
/**
* 事件的向上傳遞
*@param ev 動作物件
*@return true: 在當前的dispatchtouchevent中消費事件,事件停止傳遞
* false: 攔截事件的分發,並向上傳遞使父view對動作事件進行了的消費和傳遞
* super.dispatchtouchevent(ev): 對事件進行流程判定進入本層的
*/public
boolean
dispatchtouchevent(motionevent ev)
/**
* 事件的向下傳遞
* param ev 動作物件
*@return true: 進行向下傳遞事件的攔截,並將事件傳遞到本層的
* false: 不攔截事件的向下傳遞
* super.onintercepttouchevent(ev): 不攔截事件的向下傳遞
*/public
boolean
onintercepttouchevent(motionevent ev)
/**
* 事件的消費
* param ev 動作物件
*@return true: 事件已消費,不再傳遞
* false: 事件消費未完成,繼續向上傳遞
* super.ontouchevent(ev): 事件消費未完成,繼續向上傳遞
*/public
boolean
ontouchevent(motionevent ev)
當然乙個完整的動作事件中會包含許多的細節流程,如:action_down,action_up,action_move等,從action_down到action_up或者action_cancel的過程其實是乙個記憶過程,正如上述的流程,當組員的能力被定義為無法實現該任務的時候,那麼下一次相同的task就不會移交組員來做,而是由能完成該task的leader來實現。所以當出現事件攔截的時候,action_down經歷的事件分發流程在action_up就會直接被分發到能真正消費該action的view層被消費。省去了中間向上傳遞過程。 Android事件傳遞機制
android中的事件型別分為按鍵事件和螢幕觸控事件,touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的了解。乙個最簡單的螢幕觸控動作觸發了一系列touch事件 action down action move action move action move.action move acti...
Android事件傳遞機制
android中dispatchtouchevent,onintercepttouchevent,ontouchevent的理解 android中的事件型別分為按鍵事件和螢幕觸控事件,touch事件是螢幕觸控事件的基礎事件,有必要對它進行深入的了解。乙個最簡單的螢幕觸控動作觸發了一系列touch事件...
Android事件傳遞機制 零
mainactivity如下 package com.cn import android.os.bundle import android.view.motionevent import android.view.view import android.view.view.ontouchlisten...