Android 事件分發(fā)總結(jié)

一、View事件分發(fā)

先看看這幾種現(xiàn)象
View與Touch事件相關(guān)的兩個方法

1.1 dispatchTouchEvent事件分發(fā)
源碼中俯萌,首先將result = false;
boolean result = false;
再拿到ListenerInfo惧所, 存放了關(guān)于View的所有Listener信息如 OnTouchListener 、OnClickListener等
ListenerInfo li = mListenerInfo;
若onTouchListener.onTouch()返回true埠对,則result置為true术健;

            ListenerInfo li = mListenerInfo;
            if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                result = true;
            }

再往下看汹碱, 如果 result = false 就會執(zhí)行onTouchEvent; 如果result = true 就不會執(zhí)行onTouchEven荞估,這里就解釋了咳促,會先執(zhí)行onTouchListener中的方法稚新。

            if (!result && onTouchEvent(event)) {
                result = true;
            }

目前還未看到有點擊事件onClick(),進入到onTouchEvent()中,
case MotionEvent.ACTION_UP: 里面調(diào)用了 performClick()

switch (action) { 
                case MotionEvent.ACTION_UP:              
                            //.....其他代碼省略    
                                if (mPerformClick == null) {
                                    mPerformClick = new PerformClick();
                                }       
                                if (!post(mPerformClick)) {
                                      performClickInternal();
                               }

所以當onTouchEvent()返回true時,不會執(zhí)行onClick()跪腹,又或者說只有當調(diào)用了onTouchEvent的super()方法時褂删,才會執(zhí)行onClcik().
因為onClick()方法是在View.onTouchEvent的super()方法中。

二冲茸、ViewGroup事件分發(fā)

**dispatchTouchEvent() **事件分發(fā):

boolean handled = false;
final int action = ev.getAction();
final int actionMasked = action & MotionEvent.ACTION_MASK;

ACTION_DOWN事件中屯阀,先將TouchTargets 清除,
并且將
mFirstTouchTarget = null

           if (actionMasked == MotionEvent.ACTION_DOWN) {
              // 清除TouchTargets 只要知道 mFirstTouchTarget = null
                cancelAndClearTouchTargets(ev);
                resetTouchState();
            }

再到onInterceptTouchEvent()事件轴术,正常情況返回false难衰;
onInterceptTouchEvent()返回false時,反序獲取子View膳音,執(zhí)行子View的dispatchTouchEvent()方法召衔;onInterceptTouchEvent()返回true時,將不執(zhí)行子view的方法祭陷。

             //是否攔截
            final boolean intercepted;
            if (actionMasked == MotionEvent.ACTION_DOWN
                    || mFirstTouchTarget != null) {
                //子類是否請求攔截
                final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
                if (!disallowIntercept) {
                    //正常情況下苍凛,會走到onInterceptTouchEvent()中
                    intercepted = onInterceptTouchEvent(ev);
                    ev.setAction(action); 
                } else {
                    intercepted = false;
                }
            } else {
                intercepted = true;
            }
            if (!canceled && !intercepted) {
                    if (newTouchTarget == null && childrenCount != 0) {
                        for (int i = childrenCount - 1; i >= 0; i--) {
                            // 反序的for循環(huán)  獲取子 View child,執(zhí)行子類的dispatchTouchEvent
                            //這里如果子類沒有一個地方返回true兵志,默認是返回false醇蝴,則不會進入判斷
                            if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) {
                                // 如果子 View 返回true 就會進來 主要給 mFirstTouchTarget = target; 
                                // 這種情況,move和up事件進來的時候想罕,不會調(diào)用子view 的dispatchTouchEvent事件悠栓。
                                // 最后調(diào)用到自己的dispatchTouchEvent事件,也就是ViewGroup的按价。
                                newTouchTarget = addTouchTarget(child, idBitsToAssign);
                                 break;

三惭适、總結(jié)

最后貼個圖總結(jié)下


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市楼镐,隨后出現(xiàn)的幾起案子癞志,更是在濱河造成了極大的恐慌,老刑警劉巖框产,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凄杯,死亡現(xiàn)場離奇詭異,居然都是意外死亡秉宿,警方通過查閱死者的電腦和手機戒突,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來描睦,“玉大人膊存,你說我怎么就攤上這事。” “怎么了膝舅?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵嗡载,是天一觀的道長窑多。 經(jīng)常有香客問我仍稀,道長,這世上最難降的妖魔是什么埂息? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任技潘,我火速辦了婚禮,結(jié)果婚禮上千康,老公的妹妹穿的比我還像新娘享幽。我一直安慰自己,他們只是感情好拾弃,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布值桩。 她就那樣靜靜地躺著,像睡著了一般豪椿。 火紅的嫁衣襯著肌膚如雪奔坟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天搭盾,我揣著相機與錄音咳秉,去河邊找鬼。 笑死鸯隅,一個胖子當著我的面吹牛澜建,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝌以,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炕舵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跟畅?” 一聲冷哼從身側(cè)響起咽筋,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碍彭,沒想到半個月后晤硕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡庇忌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年舞箍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皆疹。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疏橄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捎迫,我是刑警寧澤晃酒,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站窄绒,受9級特大地震影響贝次,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彰导,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一蛔翅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧位谋,春花似錦山析、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赊淑,卻和暖如春爵政,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膏燃。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工茂卦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人组哩。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓等龙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伶贰。 傳聞我的和親對象是個殘疾皇子蛛砰,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355