android面试题集锦(珍藏)
Android面试题集锦 (1):事件分发机制概述 首先应该搞清楚两个问题:事件分发机制分发的是什么?怎么进行分发? 分发的是MotionEvent事件了,因而我们讨论的问题就成了当MotionEvent事件生成之后,事件是怎么传递到某一个View控件上面并且得到处理的过程; android事件产生后的传递过程是从Activity--->Window--->View的,即隧道式传递,2而View又分为不包含子 View的View以及包含子View的ViewGroup,事件产生之后首先传递到Activity上面,而Activity接着会传递到 PhoneWindow上,PhoneWindow会传递给RootView,而RootView其实就是DecorView了,接下来便是从 DecorView到View上的分发过程了,具体就可以分成ViewGroup和View的分发两种情况了; ### Android事件分发机制详解 #### 一、事件分发机制概述 在Android开发中,事件分发机制是非常重要的一个概念。理解这一机制有助于开发者更好地处理用户交互,并且能够优化应用性能。本节将深入探讨Android事件分发机制的核心概念。 #### 二、事件分发流程 **1. 事件产生** 当用户与界面发生交互时,如触摸屏幕,会产生一系列的事件,这些事件以`MotionEvent`的形式存在。`MotionEvent`包括但不限于按下、移动、抬起等操作。 **2. 事件传递路径** 事件产生后,其传递路径遵循特定顺序: - **Activity**: 事件首先被传递给当前处于前台的`Activity`。 - **Window**: `Activity`将事件交给它的`Window`对象处理。 - **DecorView**: `Window`中的`DecorView`接收事件,并负责将其传递给具体的`View`或`ViewGroup`。 - **View/ViewGroup**: 最终,事件到达目标`View`或`ViewGroup`。 #### 三、ViewGroup与View的事件分发过程 **1. ViewGroup的事件分发** - **dispatchTouchEvent()**: 当事件传递到某个`ViewGroup`时,首先调用此方法。 - **onInterceptTouchEvent()**: 在`dispatchTouchEvent()`中,会调用此方法来判断是否拦截事件。 - 如果`onInterceptTouchEvent()`返回`true`,则事件被拦截,`ViewGroup`将自行处理事件,调用自身的`onTouchEvent()`。 - 如果返回`false`,表示不拦截事件,事件将继续传递给子`View`。 - **子View的事件分发**: 如果子`View`也是一个`ViewGroup`,则重复上述过程;如果是`View`,则进入下一个步骤。 **2. View的事件分发** - **dispatchTouchEvent()**: 事件传递给`View`时,首先调用此方法。 - **onTouchListener.onTouch()**: 如果为`View`设置了`onTouchListener`,则首先执行`onTouch()`方法。根据其返回值决定是否继续传递: - 返回`true`: 表示事件已被消费,不再向下传递。 - 返回`false`: 事件将继续传递,并可能触发后续处理。 - **onTouchEvent()**: 如果`onTouch()`返回`false`,则`View`将执行自身定义的`onTouchEvent()`。 - **onLongClickListener.onLongClick()**: 如果设置了`onLongClickListener`,则首先执行`onLongClick()`方法。类似于`onTouch()`,根据其返回值决定是否继续传递: - 返回`true`: 表示事件被消费,不再向下传递。 - 返回`false`: 事件将继续传递。 - **OnClickListener.onClick()**: 如果设置了`OnClickListener`,则执行`onClick()`方法。注意,`onClick()`方法没有返回值,因此事件传递到此为止。 #### 四、特殊事件处理场景 **1. 未被消费的DOWN事件** 如果事件传递到最内层的`View`后,`onTouchEvent()`返回`false`,那么事件将以冒泡方式向上回传,依次调用父`View`的`onTouchEvent()`方法,直到找到能处理事件的`View`或最终由`Activity`处理。 **2. 事件分发注意事项** - **未消费DOWN事件**: 如果除了`Activity`外的任何`View`均未消费DOWN事件,则事件将不再传递给`Activity`内的子`View`,而直接由`Activity`处理。 - **ViewGroup拦截事件**: 一旦`ViewGroup`决定拦截事件,后续事件序列将不再由其子`View`处理。 - **未消费事件序列**: 如果`View`开始处理事件但未能消费DOWN事件,后续事件序列将不再由该`View`处理。 - **onTouchEvent()执行条件**: `View`的`onTouchEvent()`是否执行取决于`onTouchListener`的`onTouch()`方法的返回值。 #### 五、总结 通过以上分析,我们可以看出Android的事件分发机制是一个复杂而精细的过程。开发者需要理解每个阶段的工作原理,以便更好地控制和响应用户交互。此外,合理的事件分发策略不仅可以提高用户体验,还可以提升应用性能。
剩余54页未读,继续阅读
- 粉丝: 249
- 资源: 37
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助