美文网首页
Android事件分发传递过程

Android事件分发传递过程

作者: 雨田Android开发 | 来源:发表于2019-05-30 15:35 被阅读0次

    Android中事件触发是由外向内的,返回则是从里向外,今天大概介绍一下事件的分发机制
    首先来说一下过程,Android事件分发是由activity-> DecorView->view group->view的过程,主要涉及的方法有

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

    事件分发,这个方法主要是起到分发的作用

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

    此方法是对事件传递进行拦截,主要是在ViewGroup中才会有,返回true代表不允许事件继续向子View传递,将会触发当前View的onTouchEvent(),进行事件的消费;返回false代表不对事件进行拦截,事件可以传递给子view,默认返回false

     @Override
        public boolean onTouchEvent(MotionEvent ev) {
            return super.onTouchEvent(ev);
        }
    

    此方法是触摸事件,参数为手势集合,这里就是监听用户的手势动作,然后回调touchlistener的onTouch方法。如果我们仅仅只是用手指点击按钮,然后马上松开,onTouch事件中只会执行ACTION_DOWN和ACTION_UP动作;如果用手机点击按钮,并且手指还在按钮上滑动了一会儿,那么滑动的过程中,ACTION_MOVE动作就会不停的执行

    那么onClick事件又是如何触发的呢,怎么样才能只执行onTouch而不执行onClick呢?
    从源码上看,是先执行onTouch,根据用户的手势和返回值来决定是不是要执行onClick事件,也就是说onTouch执行在onClick之前,并且能够影响onClick的执行。
    如果只想执行onTouch事件并且不往下分发执行的话,只需要将onTouch方法的返回值改为true,就会只执行onTouch事件,不执行onClick事件

    总结 事件传递机制调用顺序:
    ViewGroup的事件传递方法:
    dispatchTouchEvent
    onInterceptTouchEvent
    onTouchEvent
    View的事件传递方法:
    dispatchTouchEvent
    onTouchEvent
    只有ViewGroup容器才有onInterceptTouchEvent方法。因为作为最后的子view没必要再拦截了,已经无法继续向下传递事件了,是否拦截已经没有意义了。

    相关文章

      网友评论

          本文标题:Android事件分发传递过程

          本文链接:https://www.haomeiwen.com/subject/xbhvtctx.html