深度解析:Android Touch事件分发机制
160 浏览量
更新于2024-08-28
收藏 181KB PDF 举报
"Android Touch事件分发过程详解"
在Android应用程序开发中,理解触摸事件的分发机制是非常关键的,因为它直接影响到用户界面的交互体验。本文将详细解析Android Touch事件如何在视图层次结构中进行传递和处理。
首先,我们来看一个简单的例子,这个例子包含了一个`FrameLayout`作为根视图,其中有一个`Button`。布局文件如下:
```xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
tools:context="com.example.touch_event.MainActivity"
tools:ignore="MergeRootFrame">
<Button
android:id="@+id/my_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</FrameLayout>
```
在`MainActivity`中,我们为`Button`设置了`OnTouchListener`:
```java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mBtn = (Button) findViewById(R.id.my_button);
mBtn.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("", "###onTouch:" + event.getAction());
return false;
}
});
}
}
```
当用户在屏幕上进行触控操作时,Android系统会生成一系列的MotionEvent。这些事件通常包括ACTION_DOWN(手指触摸屏幕)、ACTION_MOVE(手指在屏幕上移动)、ACTION_UP(手指离开屏幕)等。这些事件会沿着视图层次结构从父视图到子视图依次分发,这个过程称为“事件分发”。
1. 事件捕获(Capture)阶段:事件首先由最顶层的父视图接收到,即`FrameLayout`。在`onInterceptTouchEvent`方法中,父视图可以选择拦截事件,不向下传递,或者允许事件继续分发给子视图。在这个例子中,`FrameLayout`默认不会拦截事件,所以事件会继续分发给`Button`。
2. 事件传递(Delivery)阶段:如果父视图没有拦截事件,事件会到达子视图,即`Button`。子视图的`onTouchEvent`方法会被调用。在这个阶段,我们可以通过返回`true`或`false`来决定是否消费事件。如果`onTouchEvent`返回`true`,表示事件被当前视图消费,系统将不再向其他视图分发此事件;返回`false`则表示事件未被处理,系统会尝试将事件分发给更上层的视图。
在这个例子中,`onTouchListener`中的`onTouch`方法返回`false`,意味着事件未被处理,因此事件可能会上升到父视图。通常,如果子视图想要处理事件并阻止事件继续向上分发,应该返回`true`。
3. 事件结束:当ACTION_UP或ACTION_CANCEL事件发生时,表示触摸事件结束。ACTION_CANCEL可能在用户的手指离开屏幕但仍在可触摸区域外移动时触发,此时系统会通知所有相关的视图事件已经结束。
理解这个事件分发机制对于自定义视图和处理复杂的触摸交互至关重要。开发者可以根据需要在不同层级的视图中实现不同的触摸行为,从而创建出丰富的用户界面。在实际开发中,合理利用`onInterceptTouchEvent`和`onTouchEvent`可以实现复杂的手势识别和事件处理逻辑。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2016-12-29 上传
2020-08-27 上传
2021-09-21 上传
2019-08-06 上传
2018-06-04 上传
2013-03-13 上传
weixin_38728183
- 粉丝: 5
- 资源: 942
最新资源
- FACTORADIC:获得一个数字的阶乘基数表示。-matlab开发
- APIPlatform:API接口平台主页接口调用网站原始码(含数十项接口)
- morf源代码.zip
- 参考资料-附件2 盖洛普Q12 员工敬业度调查(优秀经理与敬业员工).zip
- MyJobs:Yanhui Wang 使用 itemMirror 和 Dropbox 管理作业的 SPA
- SiFUtilities
- PrivateSchoolManagementApplication:与db连接的控制台应用程序
- python-sdk:MercadoLibre的Python SDK
- Docket-App:笔记本Web应用程序
- Crawler-Parallel:C语言并行爬虫(epoll),爬取服务器的16W个有效网页,通过爬取页面源代码进行确定性自动机匹配和布隆过滤器去重,对链接编号并写入url.txt文件,并通过中间文件和三叉树去除掉状态码非200的链接关系,将正确的链接关系继续写入url.txt
- plotgantt:从 Matlab 结构绘制甘特图。-matlab开发
- 【精品推荐】智慧体育馆大数据智慧体育馆信息化解决方案汇总共5份.zip
- tsu津
- houdini-samples:各种Houdini API的演示
- parser-py:Python的子孙后代工具
- proton:Vue.js的无渲染UI组件的集合