一.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的分发过程