Android高阶之事件传递机制的总结

事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中的原理,那在设计各种滑动效果时就会感到很困惑。

关于事件的传递,我们可能会有以下疑问:

事件是如何传递的
事件是如何处理的
自定义view的时候,事件也冲突了怎么解决

Android中事件传递机制的总结

一、事件分发的原理:

1、事件是如何传递的:

(1)首先由Activity分发,分发给根View,也就是DecorView(DecorView为整个Window界面的最顶层View)
(2)然后由根View分发到子的View

如下图所示:

Android高阶之事件传递机制的总结_第1张图片

再来看下面这张图:(这张图是整个事件传递机制的核心)
Android高阶之事件传递机制的总结_第2张图片

上图显示:

  在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截。onInterceptTouchEvent方法:
  返回true代表不允许事件继续向子View传递,将会触发当前View的onTouchEvent(),进行事件的消费;
  返回false代表不对事件进行拦截,事件可以传递给孩子
  默认返回false

2、事件是如何处理的:
Android高阶之事件传递机制的总结_第3张图片

再来看下面这张图:
Android高阶之事件传递机制的总结_第4张图片

上图显示:子View中如果将传递的事件消费掉,父类的ViewGroup中将无法接收到任何事件

二、onTouch和onClick事件同时发生的问题:

首先这里要解释一下各种概念,避免混淆。

1、各种概念:

事件:
  混合体(可能是点击事件也可能是触摸事件)。

触摸事件:
  按下、滑动和离开

点击事件:
  按下、停留一会儿和离开

触摸onTouch事件和点击onClick事件有什么关系?

(1)执行先后不一样。触摸事件先执行
(2)触摸事件返回值影响点击事件(前者影响后者,而后者不影响前者)

2、onTouch和onClick事件同时执行:

     public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                   case MotionEvent.ACTION_DOWN: //按下的动作 
                        break;
                   case MotionEvent.ACTION_MOVE: //滑动的动作 
                        break;
                   case MotionEvent.ACTION_UP: //离开的动作
                        break;
            }
            return false;  //默认的返回值
     }

执行完,MotionEvent.ACTION_UP才会执行onClick()方法

3、只执行onTouch事件,不执行onClick事件:

如果只想执行onTouch事件,不执行onClick事件,该怎么做呢?很简单,只需要在onTouch()改return true,就行了,即:将onTouch方法的返回值改为true,就会只执行onTouch事件,不执行onClick事件。

三、onClick和onLongClick事件能同时发生:

1、onTouch事件、onLongClick事件、onClick事件默认是同时执行:(执行的先后顺序:onTouch > onLongClick > onClick)

2、只执行onTouch事件和onLongClick事件,不执行onClick事件:将onLongClick方法的返回值改为true,就不会执行onClick事件了。

你可能感兴趣的:(android)