深度解析 Android 事件分发机制中的消费过程
2023-09-06 16:49:03
在上一篇文章《源码角度分析事件分发消费》中,我们从源码的角度了解了事件分发的过程、源码依据以及需要注意的点。相信大家和我一样,看完之后都想跃跃欲试,懂了这么多道理想好好的过一下人生。这一篇就是实践篇,让我们看下懂了那些知识之后怎么去运用。
首先,我们做一个简单的 ViewPager。废话不多说,直接上代码:
public class MyViewPager extends ViewPager {
public MyViewPager(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// 拦截事件
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
return true;
}
// 事件不消费,交给子 View 处理
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// 不拦截事件,交给子 View 处理
return false;
}
}
在这个简单的 ViewPager 中,我们重写了 onTouchEvent()
和 onInterceptTouchEvent()
方法。在 onTouchEvent()
方法中,我们让 ViewPager 在接收到 MotionEvent.ACTION_DOWN
事件时进行拦截,而在 onInterceptTouchEvent()
方法中,我们不拦截事件,而是交给子 View 处理。
运行这个 ViewPager,我们可以看到,当我们在 ViewPager 上滑动时,ViewPager 会拦截 MotionEvent.ACTION_DOWN
事件,然后将后续的事件交给子 View 处理。这意味着,ViewPager 不会处理子 View 的点击事件和滑动事件,而是由子 View 来处理。
接下来,我们再做一个简单的 Button。代码如下:
public class MyButton extends Button {
public MyButton(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// 消费事件
return true;
}
}
在这个简单的 Button 中,我们重写了 onTouchEvent()
方法。在 onTouchEvent()
方法中,我们让 Button 消费所有的触摸事件。
运行这个 Button,我们可以看到,当我们在 Button 上点击或滑动时,Button 会消费所有的触摸事件,不会再将事件传递给它的父 View。这意味着,Button 的点击事件和滑动事件不会被父 View 处理,而是由 Button 自己处理。
通过这两个简单的例子,我们了解了事件分发机制中的消费过程。消费事件是指 View 或 ViewGroup 在接收到触摸事件后,不再将事件传递给它的子 View 或父 View,而是自己处理这些事件。
事件消费可以用于实现各种各样的功能。例如,我们可以通过消费事件来实现 View 的拖拽、旋转和缩放等操作。我们还可以通过消费事件来实现手势识别、双击放大等功能。
在实际开发中,我们经常会用到事件消费。因此,掌握事件分发机制中的消费过程对于我们来说非常重要。