Android事件分发机制(一)

一.Android事件分发机制的一些概念及方法

  • 在写事件分发之前,先说说什么是事件分发机制?
    事件分发其实就是我们再点击一个View或者ViewGroup之后,系统需要把这个事件传递到具体的View或者ViewGroup上
  • 说到事件分发就得必须讲讲其中三个重要的方法
    1.public boolean dispatchTouchEvent(MotionEvent event)
    进行判断是否消费该事件如果返回true则代表消费该事件,如果返回false代表不消费该事件
    2.public boolean onInterceptTouchEvent(MotionEvent event)
    进行判断是否拦截该事件如果返回true代表需要拦截此事件,如果返回false代表不拦截此事件,将事件向下传递
    3.pulbic boolean onTouchEvent(MotionEvent event)
    该方法使用来处理该事件
  • 下来说下这三个事件之间的关系这里用伪代码表示一下

在ViewGroup中

public  boolean dispatchTouchEvent(MotionEvent  event){
    boolean isConsums =false;
    if(onInterceptTouchEvent(event){
        isConsums =onTouchEvent(event);
     }else{
         isConsums =child.dispatchTouchEvent(event);
    }
    return isConsums ;
}

这里解释一下上面的代码
1.在一个ViewGroup中,当一个事件产生后,首先会传递到根ViewGroup中。
2.当该事件传递到ViewGroup之后会调用dispatchTouchEvent方法。
3.接着回调用onInterceptTouchEvent方法,上面已经介绍了onInterceptTouchEvent是进行判断是否拦截该事件,如果onInterceptTouchEvent方法返回true则表示拦截该事件就会调用onTouchEvent方法,然后onTouchEvent方法就会对相应的事件进行处理。如果返回false则表示不拦截该事件则会调用ViewGroup中子View的dispatchTouchEvent方法然后依次类推,直到子View拦截该事件。

在View中

我们要知道在View中是没有onInterceptTouchEvent这个方法,那么在VIew中上面的三个方法是什么关系呢
在这里我也写一下伪代码

public  boolean dispatchTouchEvent(MotionEvent  event){
    boolean isConsums =false;
    if(OnTouchListener !=null &&(mViewFlags & ENABLED_MASK) == ENABLED)){
         isConsums =  OnTouchListener.onTouch(this,event);
     }else{
         isConsums =onTouchEvent(event);
    }
    return isConsums ;
}

解释一下上面的代码
1.在一个View中,如果产生一个事件,就会调用View的dispatchTouchEvent方法
2.调用View的dispatchTouchEvent方法之后,下来就是处理事件了,首先他会判断当前View有没有设置OnTouchListener 方法和当前View是否可以点击,如果两个都成立就会调用OnTouchListener 的onTouch()方法,如果不成立就会调用onTouchEvent方法进行相应的事件处理
3.从上面的代码中我们可以看出OnTouchListener 的优先级要高于onTouchEvent的优先级。

二.事件的传递过程

当一个事件产生之后他的传递过程
当事件产生以后他会传到Activity中,然后由Activity中的dispatchTouchEvent方法对该事件进行分发。如果返回true则调用Activity的onTouchEvent方法整个事件分发就会结束,如果返回false就会调用getWindow().superDispatchTouchEvent(ev)方法将事件传递到Window,然后window就会将事件传递给decor View(顶级View)。

下面就是源码,通过源码也就验证了我上面所说的,事件传递过程。

   public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }
  public void onUserInteraction() {
    }

因为篇幅的原因,这里先做一个总结,后面会写一下View和ViewGroup的分发过程

猜你喜欢

转载自blog.csdn.net/liao5214/article/details/70875952
今日推荐