ViewGroup事件传递方法:
dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
(1)—dispatchTouchEvent:当前view接到事件调用的方法,返回boolean类型值,会调用如下伪代码逻辑,所以返回值会受自己的
onTouchEvent和子类的dispatchTouchEvent返回值决定。
(2)—onInterceptTouchEvent:负责是否拦截事件,返回boolean类型值,返回true则表示拦截,返回false则不拦截,默认值返回false,在同一事件序列中,返回true则调用当前view的onTouchEvent,返回false则调用子view的事件序列,如果onInterceptTouchEvent在某个事件中返回true,下次的序列事件不再调用onInterceptTouchEvent方法,dispatchTouchEvent直接掉到onTouchEvent.
(3)—onTouchEvent:负责处理事件,返回boolean类型值
View的事件传递方法:
dispatchTouchEvent、 onTouchEvent
ViewGroup和View事件传递关系如下(伪代码)
public boolean dispatchTouchEvent(MotionEvent event){
boolean consume=false;
//如果onInterceptTouchEvent返回true,则不调用子类事件
if(onInterceptTouchEvent(event)){
//调用自己的 onTouchEvent事件
consume=onTouchEvent(event);
}else{
//调用子类得dispatchTouchEvent事件进行向下传递
consume=child.dispatchTouchEvent(event);
}
return consume;
}
手指触摸到滑动到抬起的事件过程
(1)触摸:
(2)滑动:滑动时不断调用此流程
(3)抬起:
处理滑动冲突方法
1.水平和竖直滑动冲突:比如scrllVIew嵌套listview
判断水平滑动和竖直滑动的移动距离差,水平>竖直 则水平滑动,反之。
2.同一方向滑动冲突,比如listview嵌套listview
这个必须有需求限定的,比如内部listview滑动到顶部了,则再滑动时,则事件交由外部的listview处理,同方向的滑动,是需要项目需求然后再定规则,只要处理滑动时执行的流程,在流程中做好自己的限制就可以实现自己的解决方案。