Android事件传递顺序

事件传递顺序

我们假设在一个activity中有一个ViewGroup,ViewGroup中有一个TextView。

Android事件传递顺序_第1张图片
image.png

我们设置不同层级的不同事件拦截方法的返回值,每此触控TextView区域来观察事件的传递情况。监听方法有:

  • Activity的dispatchTouchEvent和onTouchEvent

  • ViewGroup的dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent

  • TextView的dispatchTouchEvent和onTouchEvent

一共7个方法,如果下面展示的打印日志没有出现,说明没有调用

默认事件传递顺序


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ ViewGroup onInterceptTouchEvent: down 

     ↓ TextView dispatchTouchEvent down 

     ↓ TextView onTouchEvent down 

     ↓ ViewGroup onTouchEvent: down 

     ↓ Activity onTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ Activity onTouchEvent move 

     ↓ Activity dispatchTouchEvent up 

     ↓ Activity onTouchEvent up

Activity的dispatchTouchEvent中返回true


     ↓ Activity dispatchTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ Activity dispatchTouchEvent up

Activity的dispatchTouchEvent中返回false


     ↓ Activity dispatchTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ Activity dispatchTouchEvent up

ViewGroup dispatchTouchEvent中返回true


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ Activity dispatchTouchEvent move 

     ↓ ViewGroup dispatchTouchEvent: move 

     ↓ Activity dispatchTouchEvent up 

     ↓ ViewGroup dispatchTouchEvent: up

ViewGroup dispatchTouchEvent中返回false


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ Activity onTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ Activity onTouchEvent move 

     ↓ Activity dispatchTouchEvent up 

     ↓ Activity onTouchEvent up

ViewGroup onInterceptTouchEvent中返回true


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ ViewGroup onInterceptTouchEvent: down 

     ↓ ViewGroup onTouchEvent: down 

     ↓ Activity onTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ Activity onTouchEvent move 

     ↓ Activity dispatchTouchEvent up 

     ↓ Activity onTouchEvent up

ViewGroup onInterceptTouchEvent中返回true 并且 onTouchEvent返回true


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ ViewGroup onInterceptTouchEvent: down 

     ↓ ViewGroup onTouchEvent: down 

     ↓ Activity dispatchTouchEvent move 

     ↓ ViewGroup dispatchTouchEvent: move 

     ↓ ViewGroup onTouchEvent: move 

     ↓ Activity dispatchTouchEvent up 

     ↓ ViewGroup dispatchTouchEvent: up 

     ↓ ViewGroup onTouchEvent: up

ViewGroup onInterceptTouchEvent中返回false


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ ViewGroup onInterceptTouchEvent: down 

     ↓ TextView dispatchTouchEvent down 

     ↓ TextView onTouchEvent down 

     ↓ ViewGroup onTouchEvent: down 

     ↓ Activity onTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ Activity onTouchEvent move 

     ↓ Activity dispatchTouchEvent up 

     ↓ Activity onTouchEvent up

TextView dispatchTouchEvent返回true


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ ViewGroup onInterceptTouchEvent: down 

     ↓ TextView dispatchTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ ViewGroup dispatchTouchEvent: move 

     ↓ ViewGroup onInterceptTouchEvent: move 

     ↓ TextView dispatchTouchEvent move 

     ↓ Activity dispatchTouchEvent up 

     ↓ ViewGroup dispatchTouchEvent: up 

     ↓ ViewGroup onInterceptTouchEvent: up 

     ↓ TextView dispatchTouchEvent up

TextView dispatchTouchEvent返回false


     ↓ Activity dispatchTouchEvent down 

     ↓ ViewGroup dispatchTouchEvent: down 

     ↓ ViewGroup onInterceptTouchEvent: down 

     ↓ TextView dispatchTouchEvent down 

     ↓ ViewGroup onTouchEvent: down 

     ↓ Activity onTouchEvent down 

     ↓ Activity dispatchTouchEvent move 

     ↓ Activity onTouchEvent move 

     ↓ Activity dispatchTouchEvent up 

     ↓ Activity onTouchEvent up

总结

  • 先借一张神图来帮助记忆(原图所在博客地址:https://www.jianshu.com/p/e99b5e8bd67b
Android事件传递顺序_第2张图片
image.png
  • 首先说明,这个统计数据是我根据demo手动修改返回值打印日志所得,过程可能存在疏忽或遗漏,如有错误,还望指正。

  • Activity的dispatchTouchEvent方法中,不论返回true或false,都表示消费事件,事件不会向下传递。

  • 在默认情况下,ViewGroup的onInterceptTouchEvent方法返回super和返回false效果是一样的

  • Activity或ViewGroup的onTouchEvent方法不靠谱,很可能被自己或下面View/ViewGroup拦截下来,只有没有任何拦截时,才会调用此方法。

  • 在down事件中,ViewGroup的onInterceptTouchEvent方法返回true,但是onTouchEvent不返回true的话,接下来的move up等事件,将不会再传递进进来,如果onTouchEvent返回true的话,后续事件才会传递进来。

你可能感兴趣的:(Android事件传递顺序)