logo头像
博客-Leo

Android事件分发机制

时间类型

  • MotionEvent.ACTION_DOWN

    当我们手指按下屏幕的第一个事件便是ACTION_DOWN了,也就是意味着事件的开始。

  • MotionEvent.ACTION_MOVE

    当我们手指按下屏幕后,在屏幕上滑动的过程,此事件就会不断的触发。

  • MotionEvent.ACTION_UP

    此事件在我们手指从屏幕抬起的时候会触发。

  • MotionEvent.ACTION_CANCEL

    这个事件说起来稍微复杂一点,举个栗子:当我们的外层View将事件传递给内层View去处理时,外层View的拦截方法一般会返回false,但是当某个条件触发后,外层View想自己处理接下来的事件,就拦截了事件分发,此时内层View就会收到ACTION_CANCEL的事件。

  • MotionEvent.ACTION_OUTSIDE

    这个事件我们不常用到,考虑这种场景。我们有一个Diallog弹出,当我们按Dialog以外的屏幕将Dialog消失掉。这个时候可以考虑监听这个事件,要想使用这个事件我们必须对当前的Window设置一个Flag:FLAG_WATCH_OUTSIDE_TOUCH。

几个方法

  • dispatchTouchEvent(MotionEvent event)

    这个方法仅在ViewGrope中,会先判断子View是否有调用disallowIntercept父View去拦截事件,如果没有,父View自己会调用onInterceptTouchEvent判断自己是否有拦截,如果拦截事件,将调用父View自己的onTouchEvent方法去处理事件,如果没有拦截事件,事件将继续分发到子View中处理。

  • onInterceptTouchEvent(MotionEvent event)

    用来申明是否拦截事件继续向下分发,如果返回true,事件将不会继续向下分发,而是交由自己的onTouchEvent方法处理。

  • onTouchEvent(MotionEvent event)

    显然,这个就是事件处理的方法了。

  • onTouch(MotionEvent event)

    这个方法是在我们对某一个setOnTouchListener时回调,也就是在传递事件的时候,在交给View本身的onTouchEvent处理之前判断是否有监听的TouchListener,如果有优先调用TouchListener的onTouch方法处理。

ViewGroup有以下三个与事件分发的方法,而View只有dispatchTouchEvent和onTouchEvent。

支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励

评论系统未开启,无法评论!