自定义 ViewGroup 的触摸反馈
1.知识点
slop:溢出,表示超出界限才认为越界
onInterceptTouchEvent:是否拦截事件,仅 ViewGroup 具有该方法;View 不具备该方法;
dispatchTouchEvent:View 和 ViewGroup 所做的该方法不同
TouchTargets:触发目标、触发对象、多点触摸,
2.触摸反馈的流程
Activity.dispatchTouchEvent()
递归:ViewGroup(View).dispatchTouchEvent()
ViewGroup.onInterceptTouchEvent()
child.dispatchTouchEvent()
super.dispatchTouchEvent()
View.onTouchEvent()
Activity.onTouchEvent()
3.事件分发机制
对于一个根 ViewGroup 来说,发生点击事件首先调用 dispatchTouchEvent
如果这个 ViewGroup 的 onIterceptTouchEvent 返回 true 就表示它要拦截当前事件,接着这个 ViewGroup 的 onTouchEvent 就会被调用.如果 onIterceptTouchEvent 返回 false,那么就会继续向下调用子 View 的 dispatchTouchEvent 方法
当一个 View 需要处理事件的时候,如果它没有设置 onTouchListener,那么直接调用 onTouchEvent.如果设置了 Listenter 那么就要看 Listener 的 onTouch 方法返回值.为 true 就不调,为 false 就调 onTouchEvent
View 的默认实现会在 onTouchEvent 里面把 touch 事件解析成 Click 之类的事件
点击事件传递顺序 Activity -> Window -> View
一旦一个元素拦截了某事件,那么一个事件序列里面后续的 Move,Down 事件都会交给它处理.并且它的 onInterceptTouchEvent 不会再调用
View 的 onTouchEvent 默认都会消耗事件,除非它的 clickable 和 longClickable 都是 false(不可点击),但是 enable 属性不会影响
版权声明: 本文为 InfoQ 作者【Changing Lin】的原创文章。
原文链接:【http://xie.infoq.cn/article/4f4330b2c1bd85f2190e77e58】。文章转载请联系作者。
评论