一 點擊事件(Touch事件)
- 當用戶觸摸螢屏時,將產生點擊事件(
Touch事件),事件相關細節(觸摸位置時間等)被封裝為MotionEvent物件
MotionEvent事件型別:
- ACTION_DOWN:初次接觸到螢屏時觸發
- ACTION_MOVE:在螢屏上滑動時觸發(多次)
- ACTION_UP:手指離開螢屏時觸發
- ACTION_CANCEL:事件被上層攔截時觸發(何時攔截后面做說明)
用戶接觸螢屏到抬起

二 事件傳遞
系統如何分發用戶的touch事件?
- 流程圖

通過原始碼分析傳遞流程,首先分析如何從Actvity傳遞到ViewGroup
Activity:
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {//事件分發并回傳結果
return true;//事件被消費
}
return onTouchEvent(ev);//沒有View可以處理,呼叫Activity onTouchEvent方法
}
activity里面的getWindow().superDispatchTouchEvent(ev),會呼叫window.superDispatchTouchEvent(ev),而Window的唯一實作類是PhoneWindow,所以會呼叫PhoneWindow.superDispatchTouchEvent
PhoneWindow:
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
}
mDecor為DecorView,可以看到PhoneWindow又呼叫了DecorView的superDispatchTouchEvent方法
- 關于DecorView
通過 getWindow().getDecorView()可以獲得
setContentView設定的View是它的子View(Activity的setContentView最終是呼叫PhoneWindow的setContentView)
DecorView繼承FrameLayout,FrameLayout繼承ViewGroup,DecorView的superDispatchTouchEvent最侄訓呼叫到ViewGroup的dispatchTouchEvent方法,其實該ViewGroup就是我們通過Activity的setContentView設定的View,該View一般為ViewGroup
以上是事件如何從activity一步步傳遞到我們通過setContentView設定的ViewGroup里面的流程,流程圖如以上所示
后續事件如何分發:事件分發之ViewGroup
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/246235.html
標籤:其他
上一篇:Android購物車效果實作(RecyclerView懸浮頭部實作)
下一篇:iOS自定義相機(帶拍攝區域邊框、半透明遮罩層、點擊螢屏對焦、自動裁剪): 1、身份證正反面相機(加一個長方形的框框并裁剪身份證照片) 2、手持證件照相機(含demo原始碼)
