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

Posted talk_8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第四百五十一回:View中的事件分发机制)相关的知识,希望对你有一定的参考价值。

文章目录


各位看官们大家好,上一回中咱们说的例子是"绘制彩虹",这一回中说的例子是" 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中的事件分发机制"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

以上是关于一起Talk Android吧(第四百五十一回:View中的事件分发机制)的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第四百五十回:绘制彩虹)

一起Talk Android吧(第四百五十八回:SeekBar补充用法一)

一起Talk Android吧(第四百五十九回:SeekBar补充用法二)

一起Talk Android吧(第四百五十七回:修改View的布局参数)

一起Talk Android吧(第四百五十二回:给View添加滑动事件一)

一起Talk Android吧(第四百五十三回:给View添加滑动事件二)