溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android編程下Touch事件的分發(fā)和消費(fèi)機(jī)制理解是怎樣的

發(fā)布時(shí)間:2021-11-26 15:17:30 來(lái)源:億速云 閱讀:103 作者:柒染 欄目:移動(dòng)開(kāi)發(fā)

Android編程下Touch事件的分發(fā)和消費(fèi)機(jī)制理解是怎樣的,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

Android 中與 Touch 事件相關(guān)的方法包括:dispatchTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能夠響應(yīng)這些方法的控件包括:ViewGroup 及其子類、Activity。方法與控件的對(duì)應(yīng)關(guān)系如下表所示:

Touch 事件相關(guān)方法  方法功能  
  ViewGroup   
     Activity     
  public boolean dispatchTouchEvent(MotionEvent ev)事件分發(fā) 
 Yes Yes
  public boolean onInterceptTouchEvent(MotionEvent ev)  
事件攔截 
 Yes No
  public boolean onTouchEvent(MotionEvent ev)事件響應(yīng) 
 Yes Yes

從這張表中我們可以看到 ViewGroup 及其子類對(duì)與 Touch 事件相關(guān)的三個(gè)方法均能響應(yīng),而 Activity 對(duì) onInterceptTouchEvent(MotionEvent ev) 也就是事件攔截不進(jìn)行響應(yīng)。另外需要注意的是 View 對(duì) dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev) 的響應(yīng)的前提是可以向該 View 中添加子 View,如果當(dāng)前的 View 已經(jīng)是一個(gè)最小的單元 View(比如 TextView),那么就無(wú)法向這個(gè)最小 View 中添加子 View,也就無(wú)法向子 View 進(jìn)行事件的分發(fā)和攔截,所以它沒(méi)有dispatchTouchEvent(MotionEvent ev) 和 onInterceptTouchEvent(MotionEvent ev),只有 onTouchEvent(MotionEvent ev)。

一、Touch 事件分析

 事件分發(fā):public boolean dispatchTouchEvent(MotionEvent ev)

Touch 事件發(fā)生時(shí) Activity 的 dispatchTouchEvent(MotionEvent ev) 方法會(huì)以隧道方式(從根元素依次往下傳遞直到最內(nèi)層子元素或在中間某一元素中由于某一條件停止傳遞)將事件傳遞給最外層 View 的 dispatchTouchEvent(MotionEvent ev) 方法,并由該 View 的 dispatchTouchEvent(MotionEvent ev) 方法對(duì)事件進(jìn)行分發(fā)。dispatchTouchEvent 的事件分發(fā)邏輯如下:

  • 如果 return true,事件會(huì)分發(fā)給當(dāng)前 View 并由 dispatchTouchEvent 方法進(jìn)行消費(fèi),同時(shí)事件會(huì)停止向下傳遞;

  • 如果 return false,事件分發(fā)分為兩種情況:

  1. 如果當(dāng)前 View 獲取的事件直接來(lái)自 Activity,則會(huì)將事件返回給 Activity 的 onTouchEvent 進(jìn)行消費(fèi);

  2. 如果當(dāng)前 View 獲取的事件來(lái)自外層父控件,則會(huì)將事件返回給父 View 的  onTouchEvent 進(jìn)行消費(fèi)。

  • 如果返回系統(tǒng)默認(rèn)的 super.dispatchTouchEvent(ev),事件會(huì)自動(dòng)的分發(fā)給當(dāng)前 View 的 onInterceptTouchEvent 方法。

 事件攔截:public boolean onInterceptTouchEvent(MotionEvent ev) 

在外層 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系統(tǒng)默認(rèn)的 super.dispatchTouchEvent(ev) 情況下,事件會(huì)自動(dòng)的分發(fā)給當(dāng)前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件攔截邏輯如下:

  • 如果 onInterceptTouchEvent 返回 true,則表示將事件進(jìn)行攔截,并將攔截到的事件交由當(dāng)前 View 的 onTouchEvent 進(jìn)行處理;

  • 如果 onInterceptTouchEvent 返回 false,則表示將事件放行,當(dāng)前 View 上的事件會(huì)被傳遞到子 View 上,再由子 View 的 dispatchTouchEvent 來(lái)開(kāi)始這個(gè)事件的分發(fā);

  • 如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默認(rèn)會(huì)被攔截,并將攔截到的事件交由當(dāng)前 View 的 onTouchEvent 進(jìn)行處理。

 事件響應(yīng):public boolean onTouchEvent(MotionEvent ev)

在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 的情況下 onTouchEvent 會(huì)被調(diào)用。onTouchEvent 的事件響應(yīng)邏輯如下:

  • 如果事件傳遞到當(dāng)前 View 的 onTouchEvent 方法,而該方法返回了 false,那么這個(gè)事件會(huì)從當(dāng)前 View 向上傳遞,并且都是由上層 View 的 onTouchEvent 來(lái)接收,如果傳遞到上面的 onTouchEvent 也返回 false,這個(gè)事件就會(huì)“消失”,而且接收不到下一次事件。

  • 如果返回了 true 則會(huì)接收并消費(fèi)該事件。

  • 如果返回 super.onTouchEvent(ev) 默認(rèn)處理事件的邏輯和返回 false 時(shí)相同。

看完上述內(nèi)容,你們掌握Android編程下Touch事件的分發(fā)和消費(fèi)機(jī)制理解是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI