麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Android > 正文

Android的Touch事件處理機制介紹

2020-04-11 12:43:27
字體:
來源:轉載
供稿:網友
Android的Touch事件處理機制比較復雜,特別是在考慮了多點觸摸以及事件攔截之后。
Android的Touch事件處理分3個層面:Activity層,ViewGroup層,View層。
首先說一下Touch事件處理的幾條基本規則。
如果在某個層級沒有處理ACTION_DOWN事件,那么該層就再也收不到后續的Touch事件了直到下一次ACTION_DOWN事件。

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

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

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

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

1.Activity層:
復制代碼 代碼如下:

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

2.View層:
復制代碼 代碼如下:

public boolean dispatchTouchEvent(MotionEvent event) {
// 省略了部分細節
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處理(如果有的話),如果TouchDelegate沒有處理再自行處理;自行處理主要負責View狀態的變換(如按下狀態),長按事件,點擊事件的檢測與觸發等。

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

分發的邏輯是,在ACTION_DOWN事件的時候,尋找子View進行處理,稱為尋找Target;如果沒有找到Target,則自行處理;如果找到Target,則交由Target處理。
從代碼上看,dispatchTouchEvent負責分發邏輯,onTouchEvent負責真正的處理邏輯,一般應該重載onTouchEvent,只有特殊情況下才需要重載dispatchTouchEvent。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人在线精品视频 | 国产污污视频 | 特黄一区二区三区 | 在线天堂中文在线资源网 | 国产精品麻豆一区二区三区 | 欧美日本日韩 | 国产一级一区二区 | 精品成人在线 | 成人免费看视频 | 国产成人自拍av | 露脸各种姿势啪啪的清纯美女 | 成人福利视频在线 | 欧美特黄一级高清免费的香蕉 | 日本视频网 | 国产精品999在线观看 | 中文字幕在线网站 | 日韩一级电影在线观看 | 伊人成人免费视频 | 成人黄色短视频在线观看 | 久久福利国产 | 午夜啪视频 | 久久国产精品91 | 51国产偷自视频区视频小蝌蚪 | 国产一国产精品一级毛片 | 毛片在线免费播放 | 久久久久久久久久美女 | 伦理三区 | 国内精品久久久久久2021浪潮 | 成年免费网站 | 中国女人内谢8xxxxxx在 | 午夜久久久精品一区二区三区 | 国产精品一区二区x88av | 视频在线中文字幕 | 欧美亚洲国产一区二区三区 | 久久亚洲综合色 | 久久999精品久久久 国产噜噜噜噜久久久久久久久 | 精品国产一区二区三区四 | 少妇一级淫片免费放播放 | 99国产精品自拍 | 欧美在线成人影院 | 黄色大片在线免费看 |