Android事件分發之View番外篇

2021-09-27 11:47:04 字數 1931 閱讀 6932

如果view同時設定了onclick和onlongclick事件,最終會有什麼效果?

結論:當onlongclick返回true時,onclick方法不會執行,當前onlongclick返回false時,onclick和onlongclick都會執行!

具體是這樣的,我簡單用語言描述一下,後面貼上關鍵的原始碼。

當view的ontouchevent執行actiom_down時,回設定乙個延時任務,在指定時間裡如果沒有鬆開手指,就會執行這個延時任務,這個延時的任務就是onlongclick,這個onlongclick的返回結果是乙個boolean型別值,最終在acton_up的時候會先判斷這個boolean值是不是為false,如果為false就執行onclick方法,否則不執行。下面我們看一下原始碼。

下面是ontouchevent執行actiom_down部分**

case motionevent.action_down:

if(event.

getsource()

== inputdevice.source_touchscreen)

mhasperformedlongpress =

false;if

(!clickable)

我們進入到checkforlongclick這個方法

private

void

checkforlongclick

(long delay,

float x,

float y,

int classification)

mpendingcheckforlongpress.

setanchor

(x, y)

; mpendingcheckforlongpress.

rememberwindowattachcount()

; mpendingcheckforlongpress.

rememberpressedstate()

; mpendingcheckforlongpress.

setclassification

(classification)

;postdelayed

(mpendingcheckforlongpress, delay);}

}

我們看一下postdelayed(mpendingcheckforlongpress, delay);這行**

private

final

class

checkforlongpress

implements

runnable

}}

看下performlongclick(mx, my),這個也就是執行了我們的onlongclick方法,當performlongclick(mx, my)返回true時mhasperformedlongpress = true;我們記住這個mhasperformedlongpress ,下面我們進入到ontouchevent的action_up裡

if

(!mhasperformedlongpress &&

!mignorenextupevent)if(

!post

(mperformclick))}

}

有這麼一段**,當if (!mhasperformedlongpress && !mignorenextupevent) 時才會執行下面的performclickinternal();也就是我們的onclick。

通過原始碼分析證明了我們上面的結論:當onlongclick返回true時,onclick方法不會執行,當前onlongclick返回false時,onclick和onlongclick都會執行!

Android 事件分發

touch 事件的分發和消費機制dispatchtouchevent onintercepttouchevent 和ontouchevent dispatchtouchevent 事件分發 true 事件會分發給當前view 並由dispatchtouchevent 方法消費,同時停止向下傳 fal...

Android事件分發

android 中與 touch 事件相關的方法包括 dispatchtouchevent motionevent ev onintercepttouchevent motionevent ev ontouchevent motionevent ev 能夠響應這些方法的控制項包括 viewgroup...

Android事件分發

當使用者觸控螢幕時,系統會對觸控事件做出相應的相應,這個事件會產生乙個motionevent,系統根據一定的規則將其傳遞給view進行處理,這個過程就是事件分發機制了。事件的傳遞分為兩個階段,即捕獲階段和冒泡階段。捕獲階段 事件最先由最外層的view接收,然後依次向內層傳遞,直到傳遞到最小的view...