一起Talk Android吧(第四百五十一回:View中的事件分发机制)

本文深入探讨了Android中View的事件分发机制,从使用背景、主要流程、关键方法及操作四个方面进行阐述。事件从按下屏幕开始,经过Activity、Window、View、ViewGroup,最终到达UI控件。主要涉及的方法有dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent(),通过重写这些方法可以实现事件的拦截和响应。了解这些知识能帮助开发者自定义控件并实现复杂的交互效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


各位看官们大家好,上一回中咱们说的例子是"绘制彩虹",这一回中说的例子是" View中的事件分发机制"。闲话休提,言归正转,让我们一起Talk Android吧!

使用背景

我们在前面章回中介绍了许多绘制图形的内容,图形只能用来演示,不能响应用户给它的事件,如果想要给图形添加事件就需要了解事件的分发机制。因此本章回中将介绍View的事件分发机制。绘制图形和响应事件结合起来就是一个完整的UI控件,掌握这些知识后我们就可以自定义了控件了。

主要流程

我们在手机屏幕上按下时发出事件->当前界面(Activity)->窗口(Window)->View->ViewGroup->UI控件(比如Button).

在整个事件传递过程中,我们可以中断事件传递,或者不响应事件,让事件继续传递,或者响应事件。

主要方法

事件的传递流程比较抽象,我们通过具体的代码来演示事件传递的流程。这其中涉及到一些方法,详细如下:

public boolean dispatchTouchEvent(MotionEvent ev) {
    return super.dispatchTouchEvent(ev);
}

public boolean onInterceptTouchEvent(MotionEvent ev) {
    return super.onInterceptTouchEvent(ev);
}

public boolean onTouchEvent(MotionEvent event) {
    return super.onTouchEvent(event);
}

这三个方法中都有相同的参数:MotionEvent类型的对象,该类封装了事件。我们可以通过该类提供的方法获取到事件的类型和触发事件所在的位置(坐标)。我们说的分发事件就是把该类型的对象当作方法的参数传递给相关的方法。

这三个方法中dispatchTouchEvent()方法是事件的最初分发者,它会调用另外两个方法来响应事件。调用的过程分成两种情况:

  • 情况一:该方法位于ViewGroup中,它首先会调用onInterceptTouchEvent()方法拦截事件,如果事件被onInterceptTouchEvent()方法拦截,那么它就不会去调用onTouchEvent()方法。事件到此不会再继续向下传递。反之,它会调用子View的dispatchTouchEvent()方法继续分发事件。

  • 情况二:该方法位于View中,它会直接调用onTouchEvent()方法来响应事件,因为View中没有onInterceptTouchEvent()方法用来拦截事件。

主要操作

对事件的操作主要有两种:拦截和响应。

  • 对事件的拦截: 对于View可以在dispatchTouchEvent()方法中进行拦截,对于ViewGroup可以在dispatchTouchEvent()或者onInterceptTouchEvent()方法中拦截。这里说的拦截就是在方法中返回true。表示已经处理过事件了,事件不会继续分发。

  • 对事件的响应 主要在onTouchEvent()方法中。我们给自定义控件添加的事件响应操作可以在此方法中完成。

如何去拦截事件或者响应事件?我们只需要重写这三个方法中的某种方法就可以,而具体的拦截或者响应操作都写在了方法中。

看官们,关于"View中的事件分发机制"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值