关于事件分发机制的思考

关于事件分发机制的思考

在Android中开发中我们有时候会遇到事件冲突的问题,其实事件冲突的问题还是很好解决的只要理解了事件分发 机制,那么按着事件分发机制的原理来解决事件冲突就变的轻而易举了。下面就让我门看看事件分发机制吧。
- 什么是事件
- 其实android中的事件我们可以称为一个流事件(个人观点我们姑且这么 叫吧),这个流事件分为三个过程
: 1 按下事件 这个时候是手指落在手机屏幕上的时候。
: 2 移动事件 这个时候手指可能移动了(比如我们快速滑动、侧滑等)
: 3 抬起事件 我们手指放到屏幕上了总不能一直放在上面吧,所以还有一个抬起来的事件。
这样我们可以将Android的事件分为三个过程,当然有时候可能只有按下和抬起事件,没有移动事件,比如我们点击一个按钮。

  • 事件是如何传递的
    在android中当我们点击屏幕的时候,实际上第一个点到的是整个手机屏幕,那么手机屏幕就知道了我们点击了手机屏幕,但是我们要点击的目标是屏幕里面的控件啊,所以这时候这个点击事件就会向我们的APP传递,也就是向activity传递,这时候一般情况下我们不会做操作禁止这个事件继续向下传递的,这时候重点来了,activity接收到这个点击事件之后如果下面还有view就继续向下传递,如果没有就自己消费掉这个点击事件了。当然在我们都不做拦截的前提下如果下面还有view那么还会继续向下传递。当传递到有View说我处理这个事件的时候,那么这个处理这个事件的view就会向上一级汇报说我处理这个事件了,上一级又向更上一级说有人处理了,最终传递给Activity,这样activity就不会去处理事件,反之如果都没有人处理这个事件,那么也会一级一级的向上汇报说我不做处理,那么最终到Activity的时候Activity也不做处理这个事件也会被消耗掉。说了这么一堆相信对一个事件的执行流程大概的知道一些了。下面我们就进入正题来看看事件是如何在手机中被处理的吧。

  • 图解事件分发

  • 事件分发流程
  • 首先解释一下dispatchTouchEvent ()是事件分发的方法,
    :当该方法返回true的时候又当前view进行消费,并且停止向下传递。
    :如果该方法返回的是false那么事件将会传递给上层的onTouchEvent()来处理,在上图中就是返回给了activity的onTouchEvent()方法处理。
    :如果该方法返回super那么事件会交给当前事件的onInterceptTouchEvent(),由onInterceptTouchEvent()来决定是否下传。
    接下来解释onInterceptTouchEvent(),该方法是事件拦截方法.
    :当该方法返回true是证明事件被拦截不继续向下传递,并将事件交给OnTouchEvent()来处理 。
    :当该方法返回false的时候证明该方法不拦截并将事件传递给下层View来处理。
    :如果该方法返回super那么默认返回false,则和返回false是一样的不对事件进行拦截
    最后是OnTouchEvent()方法。该方法是处理事件的方法
    :如果改法返回true证明该事件是由该View处理。
    :如果返回false证明该事件该VIew不做处理。
    :返回Super的情况就比较复杂了,在此不做过多讨论有时间会专门写一篇文章,有兴趣的可以自行分析源码。

-伪代码解释事件分发流程-

1.public boolean dispatchTouchEvent(Event e)
用于事件的分发,如果事件能够传递给该view,这个方法一定会被调用,返回值受当前的OnTouchEvent和子view的dispatchTouchEvent影响
2.public boolean onInterceptTouchEvent(event e)
用于事件的拦截到的方法,判断当前时间是否拦截,如果在一个事件流中一个View拦截了某个事件那么在该事件流中该方法不会再次调用,其返回结果代表该事件是否被拦截
3.public boolean onTouchEvent()
一般用于事件的最终处理

    public boolean dispatcheToutchEvent (Event e){
        if(InterceptTouchEvent(e)){
            return viewGroup.OnTouchEvent(e);
        }else{
            return view.dispatchTouchevent(e);
        }
        return false;
}

上面的伪代码非常形象的解释了View的事件传递机制,

猜你喜欢

转载自blog.csdn.net/u014379448/article/details/72579849
今日推荐