Android事件分發(fā)機(jī)制及其拓展

Android事件分發(fā)機(jī)制

? ? ? ? Android觸摸事件的流動(dòng)方向是從父視圖到子視圖吉捶,在父視圖將事件傳遞給子視圖之前何乎,父視圖會(huì)回調(diào)onInterceptTouchEvent方法呀洲,檢查是否要攔截后續(xù)事件。如果攔截闺属,子視圖會(huì)收到cancel事件计呈,將不會(huì)再收到任何后續(xù)事件,同時(shí)父視圖的onTouchEvent方法將會(huì)收到后續(xù)事件雨席。如果不攔截菩咨,該事件會(huì)分發(fā)給子視圖。雖然父視圖可以隨時(shí)攔截事件陡厘,但子視圖也可以禁止父視圖攔截抽米。子視圖通過(guò)調(diào)用父視圖的requestDisallowInterceptTouchEvent方法,可以禁止父視圖攔截事件糙置,那么子視圖將會(huì)收到后續(xù)所有事件云茸。

? ? ? ?down事件是一次完整Android事件流的起點(diǎn),有其特殊性谤饭。一般的父視圖不會(huì)攔截down事件标捺,這樣down事件會(huì)順著視圖層級(jí),一直傳達(dá)到最頂層子視圖网持。這樣就形成了一個(gè)鏈條宜岛,每個(gè)鏈條節(jié)點(diǎn)的上游是其父視圖长踊,下游為其子視圖功舀。當(dāng)down事件到達(dá)鏈條末端的子視圖時(shí),它可以表達(dá)對(duì)此事件不感興趣--在onTouchEvent回調(diào)中返回false,那么它將會(huì)被從這個(gè)鏈條中刪除身弊。若它對(duì)這個(gè)事件感興趣辟汰,那么這個(gè)事件鏈條就成功建立了。所以在down事件的整個(gè)傳遞過(guò)程中阱佛,會(huì)初步建立這個(gè)事件傳遞鏈條帖汞。然而這個(gè)鏈條,會(huì)因?yàn)樯嫌蔚母敢晥D在onInterceptTouchEvent和onTouchEvent中同時(shí)返回true,而被切斷凑术。之后這個(gè)鏈條的末端節(jié)點(diǎn)就變成了該父視圖翩蘸。

Andoid事件分發(fā)機(jī)制的局限性

? ? ? ?從上文的事件鏈條,可以看出消耗事件的永遠(yuǎn)是末端節(jié)點(diǎn)淮逊,而上游的父視圖催首,只是不斷進(jìn)行觀察,以等待合適時(shí)機(jī)去切斷鏈條⌒古簦現(xiàn)在流行的界面設(shè)計(jì)郎任,往往會(huì)采用視圖聯(lián)動(dòng)的方式,反饋用戶的手勢(shì)動(dòng)作备籽。簡(jiǎn)單點(diǎn)說(shuō)舶治,就是當(dāng)手指在A視圖上滑動(dòng)時(shí),與A視圖并不在同一事件鏈條中的B視圖會(huì)聯(lián)動(dòng)。顯然以往的事件分發(fā)機(jī)制并不能很好的滿足這種交互需求霉猛,因?yàn)檎嬲氖录目赡苁嵌鄠€(gè)視圖尺锚。

Android事件分發(fā)機(jī)制的擴(kuò)展

? ? ? ? ?Android在原有事件分發(fā)機(jī)制的基礎(chǔ)上對(duì)其進(jìn)行了擴(kuò)展。擴(kuò)展的方式是以原有末端節(jié)點(diǎn)的onTouchEvent方法為起點(diǎn)韩脏,進(jìn)行了事件再分發(fā)缩麸。這種再分發(fā)并不包含原有分發(fā)機(jī)制中的攔截處理,可以說(shuō)是一種相對(duì)簡(jiǎn)化的事件分發(fā)模型赡矢。從末端節(jié)點(diǎn)開(kāi)始杭朱,它會(huì)向上尋找對(duì)觸摸事件感興趣的父視圖,如果找到就會(huì)建立與該父視圖的聯(lián)系吹散,需要注意的是尋找到的父視圖不一定是直接父視圖弧械。整個(gè)過(guò)程大致如下:在該末端節(jié)點(diǎn)處理之前,它會(huì)先將事件交由該父視圖進(jìn)行預(yù)先處理空民;緊接著會(huì)根據(jù)父視圖的處理情況調(diào)整自己的滾動(dòng)策略刃唐;最后再次將自己處理后的事件交由父視圖處理。為了便于理解界轩,在此舉例說(shuō)明:用戶手指在屏幕滑動(dòng)了10個(gè)像素画饥,子視圖交由父視圖處理,該父視圖消耗了4個(gè)像素浊猾,或者說(shuō)父視圖向上移動(dòng)了4個(gè)像素抖甘;子視圖得知父視圖消耗了4個(gè)像素,它可能也會(huì)消耗4個(gè)像素葫慎,就是向上移動(dòng)4個(gè)像素衔彻;最后還剩余2個(gè)像素,子視圖再次將事件交由父視圖偷办,父視圖根據(jù)自身情況艰额,選擇是否消耗剩余像素。

? ? ? ? 形象點(diǎn)說(shuō)椒涯,用戶手指移動(dòng)柄沮,就像是在畫(huà)一個(gè)餅。餅的大小是固定的废岂,子視圖和父視圖通過(guò)協(xié)商去分這個(gè)餅祖搓。當(dāng)然在分配的過(guò)程中切口要漂亮,就是說(shuō)要達(dá)到協(xié)調(diào)一致的效果泪喊。比如棕硫,在一個(gè)垂直先行布局中有上下兩個(gè)子視圖,當(dāng)手指滾動(dòng)下方視圖的時(shí)候袒啼,上方視圖也應(yīng)該協(xié)調(diào)滾動(dòng)哈扮,以維持兩個(gè)子視圖的相對(duì)位置不變纬纪。

后記

? ? ? ? ? 后續(xù)我可能會(huì)用實(shí)例去說(shuō)明整個(gè)事件分發(fā)過(guò)程,選取也是相當(dāng)?shù)湫偷膶?shí)例--CoordinatorLayout有兩個(gè)子視圖AppBarLayout和SwipeRefreshLayout,同時(shí)SwipeRefreshLayout有一個(gè)子視圖--RecyclerView.當(dāng)然滑肉,我確實(shí)不敢寫(xiě)這篇文章包各,因?yàn)樘珡?fù)雜了,更何況是要用文字清晰的表達(dá)靶庙。說(shuō)白了问畅,我懷疑我是否能把這其中的邏輯說(shuō)清楚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末六荒,一起剝皮案震驚了整個(gè)濱河市护姆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掏击,老刑警劉巖卵皂,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砚亭,居然都是意外死亡灯变,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)捅膘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)添祸,“玉大人,你說(shuō)我怎么就攤上這事寻仗∪忻冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵愧沟,是天一觀的道長(zhǎng)蔬咬。 經(jīng)常有香客問(wèn)我鲤遥,道長(zhǎng)沐寺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任盖奈,我火速辦了婚禮混坞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钢坦。我一直安慰自己究孕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布爹凹。 她就那樣靜靜地躺著厨诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪禾酱。 梳的紋絲不亂的頭發(fā)上微酬,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天绘趋,我揣著相機(jī)與錄音,去河邊找鬼颗管。 笑死陷遮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垦江。 我是一名探鬼主播帽馋,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼比吭!你這毒婦竟也來(lái)了绽族?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衩藤,失蹤者是張志新(化名)和其女友劉穎项秉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體慷彤,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娄蔼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了底哗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岁诉。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跋选,靈堂內(nèi)的尸體忽然破棺而出涕癣,到底是詐尸還是另有隱情,我是刑警寧澤前标,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布坠韩,位于F島的核電站,受9級(jí)特大地震影響炼列,放射性物質(zhì)發(fā)生泄漏只搁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一俭尖、第九天 我趴在偏房一處隱蔽的房頂上張望氢惋。 院中可真熱鬧,春花似錦稽犁、人聲如沸焰望。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熊赖。三九已至,卻和暖如春虑椎,著一層夾襖步出監(jiān)牢的瞬間震鹉,已是汗流浹背的妖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留足陨,地道東北人嫂粟。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像墨缘,于是被迫代替她去往敵國(guó)和親星虹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容