当前位置:首页 > 安卓源码 > 技术博客 >

Android中View事件分发机制

时间:2017-08-30 23:21 来源:互联网 作者:源码搜藏 浏览: 收藏 挑错 推荐 打印

重要方法: dispatchTouchEvent onInterceptTouchEvent onTouchEvent 三者关系:if(onInterceptTouchEvent) onTouchEvent; else child.dispatchTouchEvent; 规则:对根ViewGroup,产生点击事件时,dispatchTouchEvent就会调用,如果onInterceptTouchEvent返回
重要方法:
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
三者关系:if(onInterceptTouchEvent) onTouchEvent; else child.dispatchTouchEvent;
 
规则:对根ViewGroup,产生点击事件时,dispatchTouchEvent就会调用,如果onInterceptTouchEvent返回true拦截,将事件交给自身的onTouchEvent,反之,传递到子元素,子元素dispatchTouchEvent调用,如此反复直到事件最终被处理。
 
优先级:onTouchLinstener>onTouchEvent>onClickLinstener;onTouch返回false,onTouchEvent调用;
 
事件传递顺序:Activity、Window、顶级View
 
特殊情况:onTouchEvent返回false,事件将传递给父类容器,以此类推,若所有元素都不处理,最终事件传递到Activity,由Activity的onTouchEvent处理
 
一些结论:
1.事件序列以down开始,数量不定的move,以up事件结束
 
2.某个View一旦决定拦截,一个事件序列都只能由它来处理,不会再询问onInterceptTouchEvent是否拦截
 
3.正常情况下,一个事件序列只能由一个View拦截消耗,通过特殊手段可以将本View该处理的onTouchEvent强行传递给其他View
 
4.某个View一旦开始处理事件,如果不消耗down事件,那么同一事件序列中的其他事件不会再交给该View,将事件重新交给父元素处理,调用onTouchEvent。事件一旦交给一个View处理,必须消耗掉,否则剩下的事件不再交给它
 
5.如果一个View不消耗除down事件以外的其他事件,那么事件会消失,父元素onTouchEvent不会被调用,可以接收后续事件。最终消失的点击事件会传递给Activity处理。
 
6.View 没有onInterceptTouchEvent方法,一旦接收到事件传递,onTouchEvent必然会被调用。
 
7.ViewGroup默认不拦截任何事件,源码中ViewGroup的onInterceptTouch事件默认返回false
 
8.View的onTouchEvent默认都会消耗事件,返回true.除非不可点击,clickable及longClickable同时为false。默认longClickable都为false,Button的clickable为true,TextView的为false
 
9.View的enable属性不影响onTouchEvent默认返回值
 
10.onClick会发生的前提是当前View可点击,并且接收到down和up事件
 
11.事件传递过程由外向内,总是先交给夫元素,再由父元素分发给子元素,通过requestDisallowInterceptTouchEvent可以在子元素中干预父元素的事件分发过程,down事件除外。
Android中View事件分发机制 转载https://www.codesocang.com/appboke/36534.html

技术博客阅读排行

最新文章