最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android的Touch事件處理機(jī)制介紹

 更新時(shí)間:2012年11月08日 16:33:33   作者:  
Android的Touch事件處理機(jī)制比較復(fù)雜,特別是在考慮了多點(diǎn)觸摸以及事件攔截之后,有需求的朋友可以參考下
Android的Touch事件處理機(jī)制比較復(fù)雜,特別是在考慮了多點(diǎn)觸摸以及事件攔截之后。
Android的Touch事件處理分3個(gè)層面:Activity層,ViewGroup層,View層。
首先說(shuō)一下Touch事件處理的幾條基本規(guī)則。
如果在某個(gè)層級(jí)沒(méi)有處理ACTION_DOWN事件,那么該層就再也收不到后續(xù)的Touch事件了直到下一次ACTION_DOWN事件。

說(shuō)明:
a.某個(gè)層級(jí)沒(méi)有處理某個(gè)事件指的是它以及它的子View都沒(méi)有處理該事件。
b.這條規(guī)則不適用于Activity層(它是頂層),它們可以收到每一個(gè)Touch事件。
c.如果沒(méi)有處理ACTION_MOVE這類(lèi)事件,不會(huì)有任何影響。

如果ACTION_DOWN事件發(fā)生在某個(gè)View的范圍之內(nèi),則后續(xù)的ACTION_MOVE,ACTION_UP和ACTION_CANCEL等事件都將被發(fā)往該View,即使事件已經(jīng)出界了。
第一根按下的手指觸發(fā)ACTION_DOWN事件,之后按下的手指觸發(fā)ACTION_POINTER_DOWN事件,中間起來(lái)的手指觸發(fā)ACTION_POINTER_UP事件,最后起來(lái)的手指觸發(fā)ACTION_UP事件(即使它不是觸發(fā)ACTION_DOWN事件的那根手指)。

pointer id可以用于跟蹤手指,從按下的那個(gè)時(shí)刻起pointer id生效,直至起來(lái)的那一刻失效,這之間維持不變。
如果一個(gè)ACTION_DOWN事件被父View攔截了,則任何子View不會(huì)再收到任何Touch事件了(這符合第1點(diǎn)的要求)。
如果一個(gè)非ACTION_DOWN事件被父View攔截了,則那些上次處理了ACTION_DOWN事件的子View會(huì)收到一個(gè)ACTION_CANCEL事件,之后不會(huì)再收到任何Touch事件了,即使父View不再攔截后續(xù)的Touch事件。

如果父View決定處理Touch事件或者子View沒(méi)有處理Touch事件,則父View按照普通View的處理方式處理Touch事件,否則它根本不處理Touch事件(它只負(fù)責(zé)分發(fā))。
如果父View在onInterceptTouchEvent中攔截了事件,則onInterceptTouchEvent中不會(huì)再收到Touch事件了,事件被直接交給它自己處理(按照普通View的處理方式)。
下面分層講述一些細(xì)節(jié)。

1.Activity層:
復(fù)制代碼 代碼如下:

public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) { //在這里交給View層處理
return true;
}
return onTouchEvent(ev); // 如果View層沒(méi)有處理,則在這里處理
}

2.View層:
復(fù)制代碼 代碼如下:

public boolean dispatchTouchEvent(MotionEvent event) {
// 省略了部分細(xì)節(jié)
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
return true;
}
if (onTouchEvent(event)) {
return true;
}
return false;
}

View的onTouch方法代碼比較多,主要的邏輯分兩步:先是將事件交給TouchDelegate處理(如果有的話(huà)),如果TouchDelegate沒(méi)有處理再自行處理;自行處理主要負(fù)責(zé)View狀態(tài)的變換(如按下?tīng)顟B(tài)),長(zhǎng)按事件,點(diǎn)擊事件的檢測(cè)與觸發(fā)等。

3.ViewGroup層(比較復(fù)雜):
ViewGroup層處理Touch事件的總體邏輯是:先檢測(cè)是否需要攔截,沒(méi)有攔截的話(huà)下發(fā)給子View處理,如果子View沒(méi)有處理再自行處理,自行處理的邏輯與View一樣。
攔截的邏輯是,將從down到up之間的所有事件看作一組事件,如果從down就攔截了,則組內(nèi)的后續(xù)其它事件完全交給自己處理,不需要再進(jìn)入攔截邏輯了;如果是從中間攔截,則先給子View發(fā)送cancel事件,組內(nèi)的后續(xù)其它事件完全交給自己處理,不需要再進(jìn)入攔截邏輯了。

分發(fā)的邏輯是,在ACTION_DOWN事件的時(shí)候,尋找子View進(jìn)行處理,稱(chēng)為尋找Target;如果沒(méi)有找到Target,則自行處理;如果找到Target,則交由Target處理。
從代碼上看,dispatchTouchEvent負(fù)責(zé)分發(fā)邏輯,onTouchEvent負(fù)責(zé)真正的處理邏輯,一般應(yīng)該重載onTouchEvent,只有特殊情況下才需要重載dispatchTouchEvent。

相關(guān)文章

  • Android利用Java優(yōu)雅消除復(fù)雜條件表達(dá)式的方法

    Android利用Java優(yōu)雅消除復(fù)雜條件表達(dá)式的方法

    這篇文章主要介紹了Android利用Java優(yōu)雅消除復(fù)雜條件表達(dá)式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值。感興趣的小伙伴可以參考一下
    2022-06-06
  • Android性能優(yōu)化系列篇UI優(yōu)化

    Android性能優(yōu)化系列篇UI優(yōu)化

    這篇文章主要為大家介紹了Android性能優(yōu)化系列篇UI優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 一文帶你深入理解Android Window系統(tǒng)

    一文帶你深入理解Android Window系統(tǒng)

    Android中的窗口系統(tǒng)是應(yīng)用程序用戶(hù)界面的核心組件之一,它負(fù)責(zé)管理可視化區(qū)域、處理用戶(hù)輸入事件以及與系統(tǒng)UI交互,本文將深入介紹與Android窗口系統(tǒng)相關(guān)的重要概念,需要的朋友可以參考下
    2023-10-10
  • Android運(yùn)用BroadcastReceiver實(shí)現(xiàn)強(qiáng)制下線(xiàn)

    Android運(yùn)用BroadcastReceiver實(shí)現(xiàn)強(qiáng)制下線(xiàn)

    本篇文章主要介紹了Android運(yùn)用BroadcastReceiver實(shí)現(xiàn)強(qiáng)制下線(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android實(shí)現(xiàn)帶頁(yè)面切換的鎖屏功能

    Android實(shí)現(xiàn)帶頁(yè)面切換的鎖屏功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶頁(yè)面切換的鎖屏功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 一文帶你了解Android?Flutter中Transform的使用

    一文帶你了解Android?Flutter中Transform的使用

    flutter的強(qiáng)大之處在于,可以對(duì)所有的widget進(jìn)行Transform,因此可以做出非常酷炫的效果。本文就來(lái)大家了解一下Transform的具體使用,感興趣的可以了解一下
    2023-01-01
  • 一文詳解如何在Flutter中使用導(dǎo)航Navigator

    一文詳解如何在Flutter中使用導(dǎo)航Navigator

    一個(gè)APP如果沒(méi)有頁(yè)面跳轉(zhuǎn)那么是沒(méi)有靈魂的,頁(yè)面跳轉(zhuǎn)的一個(gè)常用說(shuō)法就是Navigator。那么在flutter中如何使用Navigator呢?本文就來(lái)和大家詳細(xì)聊聊
    2023-02-02
  • Android自定義評(píng)分控件的完整實(shí)例

    Android自定義評(píng)分控件的完整實(shí)例

    在Android開(kāi)發(fā)中,我們經(jīng)常會(huì)用到對(duì)商家或者商品的評(píng)價(jià),運(yùn)用星星進(jìn)行打分,下面這篇文章主要給大家介紹了關(guān)于Android自定義評(píng)分控件的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法

    Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法

    OkHttp包為安卓開(kāi)發(fā)中的HTTP協(xié)議網(wǎng)絡(luò)編程帶來(lái)了很大的便利,這里我們就來(lái)看一下最基本的、Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法:
    2016-07-07
  • Android EventBus(普通事件/粘性事件)詳解

    Android EventBus(普通事件/粘性事件)詳解

    這篇文章主要為大家詳細(xì)介紹了Android EventBus 普通事件/粘性事件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

永济市| 诏安县| 拉萨市| 龙口市| 靖州| 泰来县| 通江县| 京山县| 汤阴县| 勃利县| 谢通门县| 磴口县| 色达县| 翼城县| 陈巴尔虎旗| 多伦县| 安溪县| 淮滨县| 东安县| 泸定县| 丘北县| 丰台区| 安平县| 盐山县| 屯留县| 闻喜县| 体育| 晋江市| 黄石市| 垫江县| 旺苍县| 株洲县| 湘阴县| 沂南县| 乐清市| 万全县| 邢台市| 孟连| 福泉市| 米脂县| 武胜县|