Android 事件分發 系列文章目錄
【Android 事件分發】事件分發原始碼分析 ( 驅動層通過中斷傳遞事件 | WindowManagerService 向 View 層傳遞事件 )
【Android 事件分發】事件分發原始碼分析 ( Activity 中各層級的事件傳遞 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
【Android 事件分發】事件分發原始碼分析 ( ViewGroup 事件傳遞機制 一 )
【Android 事件分發】事件分發原始碼分析 ( ViewGroup 事件傳遞機制 二 )
【Android 事件分發】事件分發原始碼分析 ( ViewGroup 事件傳遞機制 三 )
【Android 事件分發】事件分發原始碼分析 ( ViewGroup 事件傳遞機制 四 | View 事件傳遞機制 )
【Android 事件分發】事件分發原始碼分析 ( ViewGroup 事件傳遞機制 五 )
【Android 事件分發】事件分發原始碼分析 ( ViewGroup 事件傳遞機制 六 )
【Android 事件分發】事件分發原始碼分析 ( ViewGroup 事件傳遞機制 七 )
【Android 事件分發】ItemTouchHelper 簡介 ( 拖動/滑動事件 | ItemTouchHelper.Callback 回呼 )
【Android 事件分發】ItemTouchHelper 實作側滑洗掉 ( 設定滑動方向 | 啟用滑動操作 | 滑動距離判定 | 滑動速度判定 | 設定影片時間 | 設定側滑觸發操作 )
【Android 事件分發】ItemTouchHelper 實作拖動排序 ( 設定滑動方向 | 啟啟用長按拖動功能 | 拖動距離判定 | 設定拖動觸發操作 )
【Android 事件分發】ItemTouchHelper 事件分發原始碼分析 ( 系結 RecyclerView )
【Android 事件分發】ItemTouchHelper 原始碼分析 ( OnItemTouchListener 事件監聽器原始碼分析 )
【Android 事件分發】ItemTouchHelper 原始碼分析 ( OnItemTouchListener 事件監聽器原始碼分析 二 )
【Android 事件分發】MotionEvent.ACTION_DOWN 按下事件分發流程( Activity | ViewGroup | View )
文章目錄
- Android 事件分發 系列文章目錄
- 一、事件分發相關類和方法
- 二、Activity 的事件傳遞
- 1、Activity.dispatchTouchEvent 方法事件傳遞機制
- 2、Activity.onTouchEvent 方法事件傳遞機制
- 三、ViewGroup 的事件傳遞
- 1、ViewGroup.dispatchTouchEvent 方法事件傳遞機制
- 2、ViewGroup.onInterceptTouchEvent 方法事件傳遞機制
- 3、ViewGroup.onTouchEvent 方法事件傳遞機制
- 四、View 的事件傳遞
- 1、View .dispatchTouchEvent 方法事件傳遞機制
- 2、View .onTouchEvent 方法事件傳遞機制
- 五、事件分發示意圖
- 總結
一、事件分發相關類和方法
Android 事件分發涉及到的類有 3 3 3 個 , Activity , ViewGroup , View ;
Android 事件分發涉及到的如下 7 7 7 個方法 :
- Activity 類涉及到 dispatchTouchEvent , onTouchEvent , 2 2 2 個方法 ;
public class MainActivity extends AppCompatActivity {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
- ViewGroup 涉及到 dispatchTouchEvent , onInterceptTouchEvent , onTouchEvent , 3 3 3 個方法 ;
public class MyConstraintLayout extends ConstraintLayout {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
- View 涉及到 dispatchTouchEvent , onTouchEvent , 2 2 2 個方法 ;
public class MyButton extends androidx.appcompat.widget.AppCompatButton {
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
二、Activity 的事件傳遞
1、Activity.dispatchTouchEvent 方法事件傳遞機制
事件來源 :
① 驅動層產生觸摸事件, 由 WindowManagerService 傳遞到 Activity
事件分發 :
① 停止傳遞 : 如果回傳 true / false , 說明事件被消費 , 停止傳遞
② 繼續傳遞 : 如果回傳 super.dispatchTouchEvent(ev) , 那么繼續向下傳遞, 按照如下順序逐層傳遞 : Activity -> PhoneWindow -> DecorView -> ViewGrope , 最終傳遞到 ViewGroup, 呼叫 ViewGroup 的 dispatchTouchEvent 方法
/**
* 該方法是頁面事件分發入口
*
* 針對 ACTION_DOWN 事件分析 :
* 事件來源 :
* 驅動層產生觸摸事件, 由 WindowManagerService 傳遞到 Activity
* 事件分發 :
* 如果回傳 true / false, 說明事件被消費, 停止傳遞
* 如果回傳 super.dispatchTouchEvent(ev), 那么繼續向下傳遞, 按照如下順序逐層傳遞 :
* Activity -> PhoneWindow -> DecorView -> ViewGrope
* 最終傳遞到 ViewGroup, 呼叫 ViewGroup 的 dispatchTouchEvent 方法
*
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
2、Activity.onTouchEvent 方法事件傳遞機制
事件來源 :
① 布局容器 ViewGroup 的 dispatchTouchEvent 方法回傳 false ;
② 布局容器 ViewGroup 的 onTouchEvent 方法回傳 false / super.onTouchEvent(event) ;
事件分發 : 這是事件傳遞的終點, 回傳值無所謂
① 回傳 true 說明事件被消費了 ;
/**
* 針對 ACTION_DOWN 事件分析 :
* 事件來源 :
* 布局容器 ViewGroup 的 dispatchTouchEvent 方法回傳 false
* 布局容器 ViewGroup 的 onTouchEvent 方法回傳 false / super.onTouchEvent(event)
* 事件分發 : 這是事件傳遞的終點, 回傳值無所謂
* 回傳 true 說明事件被消費了
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
三、ViewGroup 的事件傳遞
1、ViewGroup.dispatchTouchEvent 方法事件傳遞機制
/**
* 針對 ACTION_DOWN 事件分析 :
* 事件來源 :
* 從 Activity 的 dispatchTouchEvent 傳遞而來
* 從父容器 ViewGroup 的 dispatchTouchEvent 傳遞而來
* 事件分發 :
* 如果回傳 true, 表示事件被消費, 停止傳遞
* 如果回傳 false, 則傳遞給父控制元件的 onTouchEvent 方法
* 如果回傳 super.dispatchTouchEvent(ev) , 則繼續向下傳遞到 onInterceptTouchEvent 方法
*
* @param ev
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
2、ViewGroup.onInterceptTouchEvent 方法事件傳遞機制
/**
* 針對 ACTION_DOWN 事件分析 :
* 事件來源 :
* 從 本類 的 dispatchTouchEvent 方法傳遞而來
* 事件分發 :
* 回傳 true, 則停止向后傳遞, 執行本類的 onTouchEvent 方法
* 如果需要攔截, 回傳true
* 回傳 false / super.onInterceptTouchEvent(ev),
* 則繼續向 子容器/子組件 的 dispatchTouchEvent 方法傳遞; ( 這里是子組件 )
* 默認不攔截
*
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
3、ViewGroup.onTouchEvent 方法事件傳遞機制
/**
* 針對 ACTION_DOWN 事件分析 :
* 事件來源 :
* 本類的 onInterceptTouchEvent 方法回傳 true
* 子組件/子容器 的 dispatchTouchEvent 方法回傳 false
* 子組件/子容器 的 onTouchEvent 方法回傳 false / super.onTouchEvent(event)
* 事件分發 :
* 回傳 true 說明事件被消費了, 不再向下傳遞
* 回傳 false / super.onTouchEvent(event) , 則需要繼續向下傳遞
* 向父容器的 onTouchEvent 傳遞
*
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
四、View 的事件傳遞
1、View .dispatchTouchEvent 方法事件傳遞機制
/**
* 針對 ACTION_DOWN 事件分析 :
* 事件來源 :
* 父容器 ViewGroup 的 onInterceptTouchEvent 如果回傳 false / super.onInterceptTouchEvent(ev)
* 將事件傳遞到該方法
* 事件分發 :
* 如果回傳 true, 表示事件被消費, 停止傳遞
* 如果回傳 false, 則傳遞給父控制元件的 onTouchEvent 方法
* 如果回傳 super.dispatchTouchEvent(ev) , 則向本類的 onTouchEvent 方法傳遞
*
* @param event
* @return
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
2、View .onTouchEvent 方法事件傳遞機制
/**
* 針對 ACTION_DOWN 事件分析 :
* 事件來源 :
* 本類的 dispatchTouchEvent 方法回傳 super.dispatchTouchEvent(event)
* 事件分發 :
* 回傳 true 說明事件被消費了, 不再向下傳遞
* 回傳 false / super.onTouchEvent(event) , 則需要繼續向下傳遞
* 向父容器的 onTouchEvent 傳遞
*
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
五、事件分發示意圖
網上找了兩張示意圖 , 參考上述原始碼注釋理解 ;


總結
通過控制上述 7 7 7 個方法的 3 3 3 種回傳值 true / false / super , 控制整體 Activity 界面組件的事件分發 ;
事件分發規律 :
① 事件消費 : dispatchTouchEvent 或 onTouchEvent , 一旦回傳 true , 則標明事件消費 , 不再繼續分發事件 ; 注意 : Activity 的 dispatchTouchEvent 除外 , 其回傳 true / false 都表示事件已消費 , 只有 super 時才向下傳遞 ;
② 向父容器傳遞 : dispatchTouchEvent 或 onTouchEvent , 一旦回傳 false , 一律將事件傳遞給父容器的 onTouchEvent 方法 ;
③ 事件攔截 : onInterceptTouchEvent 回傳 true , 則執行自己的 , 回傳 false 則傳遞到子組件的 dispatchTouchEvent 方法 ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/291225.html
標籤:其他
