事件分发机制

  • 事件传递流程
    • 事件从Activity -> ViewGroup -> View逐级分发。
    • 涉及dispatchTouchEvent()onInterceptTouchEvent()onTouchEvent()等方法。
  • InputManagerService
    • 负责接收和处理硬件输入事件(如触摸、按键)。

安卓中的事件传递机制主要涉及触摸事件(Touch Event)的分发和处理。该机制通过三个核心方法实现:dispatchTouchEvent()onInterceptTouchEvent()onTouchEvent()。以下是事件传递的基本流程:

1. 事件分发流程

  • Activity:事件首先传递到 Activity 的 dispatchTouchEvent() 方法。
  • ViewGroup:Activity 将事件传递给根 ViewGroup(如 DecorView),ViewGroup 的 dispatchTouchEvent() 方法会调用 onInterceptTouchEvent() 决定是否拦截事件。
  • View:如果 ViewGroup 不拦截事件,事件会继续传递到子 View 的 dispatchTouchEvent() 方法,最终调用 onTouchEvent() 处理事件。

2. 核心方法

  • **dispatchTouchEvent()**:负责事件分发,决定是否将事件传递给下级 View 或自行处理。
  • **onInterceptTouchEvent()**:仅存在于 ViewGroup,用于判断是否拦截事件,拦截后事件不再传递到子 View。
  • **onTouchEvent()**:处理事件,返回 true 表示事件已处理,false 则继续向上传递。

3. 事件传递顺序

  1. ActivityViewGroupView:事件从 Activity 开始,依次传递到 ViewGroup 和 View。
  2. ViewViewGroupActivity:如果 View 未处理事件,事件会依次回传到 ViewGroup 和 Activity。

4. 事件类型 MotionEvent

  • ACTION_DOWN:手指按下,标志事件序列的开始。
  • ACTION_MOVE:手指移动。(会多次触发)
  • ACTION_UP:手指抬起,标志事件序列的结束。
  • ACTION_CANCEL:事件被取消。(事件被上层拦截时触发)

6. 事件传递示例

  • 如果用户点击一个按钮,事件从 Activity 传递到 ViewGroup,再到 Button。如果 Button 的 onTouchEvent() 返回 true,事件处理结束;否则,事件会回传到 ViewGroup 和 Activity。

7. 注意事项

  • 事件拦截:ViewGroup 可以通过 onInterceptTouchEvent() 拦截事件,阻止其传递到子 View。
  • 事件消费:View 或 ViewGroup 可以通过 onTouchEvent() 消费事件,阻止事件继续传递。

事件传递的流程:

  1. 用户在屏幕上进行触控操作;
  2. 系统首先将触摸事件传递给最上层的 ActivitydispatchTouchEvent() 方法;
  3. 如果是 ViewGroup,它会判断是否需要拦截事件(调用 onInterceptTouchEvent());
    • 如果拦截,则事件发送到该 ViewGrouponTouchEvent() 方法;
    • 如果不拦截,事件将传递给子视图的 dispatchTouchEvent() 方法;
  4. 事件最终到达目标视图后,调用该视图的 onTouchEvent() 方法进行处理。

面试

3.5 谈谈Android的事件分发机制?(享学)

当点击的时候,会先调用顶级ViewGroup的 dispatchTouchEvent(),

  • 如果顶级的ViewGroup拦截了此事件 (onInterceptTouchEvent()返回true),则此事件序列由顶级ViewGroup处理。

    • 如果顶级ViewGroup设置 setOnTouchListener,则会回调接口中的onTouch,此时顶级的ViewGroup中的onTouchEvent不再回调,如果不设置 setOnTouchListener则onTouchEvent会回调。

    • 如果顶级 ViewGroup设置setOnClickListener,则会回调接口中的 onClick

  • 如果顶级ViewGroup不拦截事件,事件就会向下传递给他的子view,然后子view就会调用它的 dispatchTouchEvent 方法。

1.事件是如何处理的?

2.onTouch与onClick之间会产生事件冲突吗?

OnTouch的返回值会影响onClick

3.事件在控件中是如何传递的?

4.事件冲突产生的根本原因?

5.事件冲突的终极解决方案?

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信