Android知识点整理-事件分发机制

285 阅读1分钟

事件分发机制

Android事件分发机制

www.jianshu.com/p/e99b5e8bd…

ACTION_MOVE和ACTION_UP在传递的过程和ACTION_DOWN 不一样 image.png ACTION_DOWN事件在哪个控件消费了(return true), 那么ACTION_MOVE和ACTION_UP就会从上往下(通过dispatchTouchEvent)做事件分发往下传,就只会传到这个控件,不会继续往下传,如果ACTION_DOWN事件是在dispatchTouchEvent消费,那么事件到此为止停止传递,如果ACTION_DOWN事件是在onTouchEvent消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并结束传递。

怎么处理滑动(事件)冲突,滑动冲突的原理

外部拦截,重写父容器onInterceptTouchEvent,也可以内部拦截比较麻烦

  1. 外部滑动方向与内部方向不一致:父容器拦截判断滑动方向
  2. 外部方向与内部方向一致:根据业务逻辑进行拦截

点击事件被拦截,但是想传到下面的View,如何操作?

getParent().requestDisallowInterceptTouchEvent(true);

  • 在子View的dispatch..或onIntercept..中 DOWN 的时候调用 requestDisallow..(true),

  • 别忘了,在UPCANCEL的时候,requestDisallow..(false)

onTouchEvent如果返回false,onClick还会执行么?(58京东)

不会,测试发现button中onTouchEvent需消费掉点击事件才会触发onclick

onTouchListener、onTouchEvent、onClick的执行顺序。(58京东)

onTouch—–>onTouchEvent—>onclick

点击一个按钮后,事件分发机制说一下

  • NextActivity-dispatchTouchEvent:0

  • MyConstraintLayout-dispatchTouchEvent:0

  • MyConstraintLayout-onInterceptTouchEvent:0false

  • MyButton-dispatchTouchEvent:0

  • MyButton-onTouchEvent:0true

  • NextActivity-dispatchTouchEvent:1

  • MyConstraintLayout-dispatchTouchEvent:1

  • MyConstraintLayout-onInterceptTouchEvent:1false

  • MyButton-dispatchTouchEvent:1

  • MyButton-onTouchEvent:1true

问点击屏幕上的按钮,如何传递到framework的

AMSclick事件传递