容易忽略的一個view事件分發中的問題

我5月份找實習的時候被百度面試的一個問題,當時確實答了一半,還有一半沒答上來,總結在了筆記本上了,現在拿出來整理了一下,詳細拿出來說一下。

問題一:

??在button設置一個onTouchListener,設置一個onClickListener,在onTouch方法里根據動作輸出對應的up,down動作,在onClick里邊輸出click。點擊按鈕,問輸出的順序。

問題二:

???如果把OnClickListener換成OnLongClickListener,長按按鈕再松開,打印什么結果順序?
???看到上面的問題,第一個問題相信很多人都能一次性答對,但是第二個問題就不一定了是吧,如果不是面試被問到,估計很難意識到這個問題,這種需要對比記憶理解的我覺得還是很有必要拿出來和大家分享一下的。
???好了,回到正題,回答問題

問題一:來,直接上個例子吧,先看結果

例子圖

如上代碼所示,定義了一個button,設置了touch和click兩個點擊事件,onTouch返回的是默認的false。在點擊事件里打了Log方便看結果

手機界面圖

很簡單的布局,就不說明什么了哈。
點擊一下按鈕:結果如下

結果圖

說明是先打印down,再打印UP,UP以后才發生click,這個從View事件分發的dispatchTouchEvent源碼可以分析出來,相信再簡單不過了。
延伸1:如果把onTouch返回true,結果會是怎樣?

代碼圖

再點擊一下按鈕,結果圖如下:
結果圖

???相信不用解釋了吧,dispatchTouchEvent里邊的if語句直接滿足三個條件,所以函數直接返回了true,消費了事件,所以不會走view的onTouchEvent嗎,自然不會觸發click事件。
問題二:
把OnClickListener換成OnLongClickListener
先解釋一下這個函數吧,
public boolean onLongClick(View v)
???參數v:參數v為事件源控件,當長時間按下此控件時才會觸發該方法。
???返回值:該方法的返回值為一個boolean類型的變量,當返回true時,表示已經完整地處理了這個事件,并不希望其他的回調方法再次進行處理;當返回false時,表示并沒有完全處理完該事件,更希望其他方法繼續對其進行處理。
???直接上代碼圖
代碼圖

界面圖

點擊一下按鈕,看結果


點擊一下--結果圖

長按按鈕別松開,看結果:


長按--結果圖

這時候松開看結果:
松開--結果圖

把onLongClick中的方法改成返回true;長按一會再松開。

結果圖

依舊打印一樣的結果。
OnLongClickListener的事件流程:
結論:
長按的調用棧:
onTouchEvent –case:ACTION_DOWN-checkForLongClick –post-
CheckForLongPress--run—performLongClick-.mOnLongClickListener.onLongClick
走一遍函數吧:

image.png

在onTouchEvent的MotionEvent.ACTION_DOWN,執行checkForLongClick

往下走
image.png
往下走
image.png
往下走
image.png
往下走
image.png
往下走

image.png

看到了吧,最后還是調用了我們設置的longclick點擊事件。回顧一下,是在case的ACTION_DOWN分支中運行的這個點擊。
所以最后點擊了mOnLongClickListener的onLongClick
??延伸2:onClick和onLongClick能同時發生嗎?
??要理解Android對事件處理的所謂消費(consume)概念即可,一個用戶的操作會被傳遞到不同的View控件和同一個控件的不同監聽方法處理,任何一個接收并處理了該次事件的方法如果在處理完后返回了true,那么該次event就算被完全處理了,其他的View或者監聽方法就不會再有機會處理該event了。
?? onLongClick的發生是由單獨的線程完成的,一般發生在ACTION_UP之前,而onClick的發生是在ACTION_UP后。臨界條件是同時發生,這里會有flag來進行區分。
?? 因此同一次用戶touch操作就有可能既發生onLongClick又發生onClick。
及時向系統表示“我已經完全處理(消費)了用戶的此次操作”,是很重要的事情。
另外一個同時執行的概念(都執行的意思),先后執行,例如,我們如果在onLongClick()方法的最后return true,那么onClick事件就沒有機會被觸發了
在onLongClick()方法return false的情況下,會有一次觸碰操作的基本時序。
??如下問題3:
把onClick和onLongClick同時寫入代碼。

image.png

??可以看到我們寫了ontouch,onclick,onlongclick三個點擊。并且兩個有個返回值的返回都是false。
??還是這個界面


界面圖
  • 點擊一下按鈕,結果:


    image.png

    這個結果沒啥解釋的吧,就是view基本的事件傳遞模型。在UP分支中執行了


    image.png

    在它里邊執行了li.mOnClickListener.onClick(this);
  • 長按一會再松開,結果:
image.png

從DOWN到UP,可以看出來前后發生了什么
??可以看到,在ACTION_UP后仍然觸發了onClick()方法。onLongClick一般發生在ACTION_UP之前,而onClick的發生是在ACTION_UP后。
??如果此時把longClick返回true,其他代碼不變。

image.png

再長按一下按鈕松開,則打印:


image.png

發現不觸發onClick了。當longclick把事件消費了以后,那么onClick事件就沒有機會被觸發了。
好了,寫了這么多其實是個特別簡單的問題,但是覺得還是應該分享一下,畢竟積少成多嘛,加油吧!騷年

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容