日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

抖音接口授權(quán)是什么東西 抖音直播實(shí)時(shí)數(shù)據(jù)接口( 二 )


當(dāng)用戶觸摸屏幕上的某個(gè) View 時(shí),handler 會(huì)對(duì)收到的消息進(jìn)行以下的處理:

抖音接口授權(quán)是什么東西 抖音直播實(shí)時(shí)數(shù)據(jù)接口


這里需要重點(diǎn)看一下 View 的 dispatchPointerEvent() 方法:
public final boolean dispatchPointerEvent(MotionEvent event) {if (event.isTouchEvent()) {return dispatchTouchEvent(event);} else {return dispatchGenericMotionEvent(event);}}在該方法中對(duì) event 進(jìn)行判斷,如果是 touchEvent 就調(diào)用 dispatchTouchEvent() 方法,否則調(diào)用 dispatchGenericMotionEvent() 方法 。判斷是否為 touch 事件的邏輯如下:
bool MotionEvent::isTouchEvent(int32_t source, int32_t action) {if (source & AINPUT_SOURCE_CLASS_POINTER) {// Specifically excludes HOVER_MOVE and SCROLL.switch (action & AMOTION_EVENT_ACTION_MASK) {case AMOTION_EVENT_ACTION_DOWN:case AMOTION_EVENT_ACTION_MOVE:case AMOTION_EVENT_ACTION_UP:case AMOTION_EVENT_ACTION_POINTER_DOWN:case AMOTION_EVENT_ACTION_POINTER_UP:case AMOTION_EVENT_ACTION_CANCEL:case AMOTION_EVENT_ACTION_OUTSIDE:return true;}}return false;}符合以上 case 的 event 即為 TouchEvent 。
首先來看一下 dispatchPointerEvent 方法中對(duì) TouchEvent 事件的處理,進(jìn)入 DecorView 的 dispatchTouchEvent() 方法中:
@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {final Window.Callback cb = mWindow.getCallback();return cb != null && !mWindow.isDestroyed() && mFeatureId < 0? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);}在該方法中,mWindow 是與 Activity 關(guān)聯(lián)的 PhoneWindow 對(duì)象,由于 DecorView 是由 PhoneWindow 創(chuàng)建的,并且通過 setWindow() 方法,DecoView 對(duì)象持有 PhoneWindow 對(duì)象的引用 。通過 getCallback() 方法,獲得了實(shí)現(xiàn)了 Window.Callback 的對(duì)象,而 Activity 實(shí)現(xiàn)了這個(gè)接口,因此當(dāng)調(diào)用cb.dispatchTouchEvent(ev) 時(shí),實(shí)際上調(diào)用的是 Activity 中的 dispatchTouchEvent() 方法 。
同樣的在 dispatchGenericMotionEvent() 方法中,也有類似的代碼邏輯:
@Overridepublic boolean dispatchGenericMotionEvent(MotionEvent ev) {final Window.Callback cb = mWindow.getCallback();return cb != null && !mWindow.isDestroyed() && mFeatureId < 0? cb.dispatchGenericMotionEvent(ev) : super.dispatchGenericMotionEvent(ev);}此方法中實(shí)際上也是調(diào)用了 Activity 的 dispatchGenericMotionEvent() 方法對(duì)事件進(jìn)行后續(xù)的分發(fā)和處理 。此時(shí)事件就已經(jīng)傳遞到了 Activity,由 Activity 進(jìn)一步進(jìn)行事件分發(fā) 。
3.觸摸事件傳遞到具體 View 的過程在研究無障礙模式下的事件傳遞過程之前,首先來回顧一下普通模式下的事件傳遞機(jī)制:
3.1 普通模式的事件分發(fā)3.1.1 普通模式下事件分發(fā) Key Method
當(dāng)一個(gè) MotionEvent 產(chǎn)生之后,系統(tǒng)需要將該事件傳遞給一個(gè)具體的 view,這個(gè)傳遞過程就是事件的分發(fā)過程 。分發(fā)過程依賴于以下三個(gè)重要方法:
  • public boolean dispatchTouchEvent(MotionEvent ev)
該方法用來進(jìn)行事件的分發(fā),方法的返回值取決于當(dāng)前 View 的 onTouchEvent() 方法和子 View 的 dispatchTouchEvent() 方法的影響 。
  • public boolean onInterceptTouchEvent(MotionEvent ev)
僅 ViewGroup 擁有的方法,用來判斷是否攔截某個(gè)事件 。
  • public boolean onTouchEvent(MotionEvent event)
在 dispatchTouchEvent() 方法中進(jìn)行調(diào)用,用來處理點(diǎn)擊事件 。
3.1.2 普通模式下的事件分發(fā)
整個(gè)分發(fā)過程可以用以下的流程圖來表示:

抖音接口授權(quán)是什么東西 抖音直播實(shí)時(shí)數(shù)據(jù)接口


3.2 無障礙模式下的事件分發(fā)無障礙模式下的事件分發(fā)與普通模式下的事件分發(fā)有很多相似之處:
3.2.1 無障礙模式下的事件分發(fā) Key Method:
與普通事件觸摸事件的分發(fā)類似,無障礙事件觸發(fā)事件分發(fā)也有類似的三個(gè)重要方法:

推薦閱讀