View的事件体系——事件分发机制

来源:互联网 发布:5173游戏交易平台源码 编辑:程序博客网 时间:2024/06/06 16:58

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处理,同方向的滑动,是需要项目需求然后再定规则,只要处理滑动时执行的流程,在流程中做好自己的限制就可以实现自己的解决方案。

原创粉丝点击