转载请注明出处:http://blog.csdn.net/ZhouLi_CSDN/article/details/45878337
看了网上那么多的博客 ,对于android系统的事件处理仍然不是明白的特别透彻,或者一些博客讲解的总是有些歧义或者讲诉的不正确或者不全面。所以自己总结了一下事件的传递机制希望可以帮助到广大的朋友。
- 假设事件传送路径为A-B-C-D-E;
- 一个手势是由事件action_down开始和action_move等其它事件以及事件action_up结束的集合;
- 一个action_down意味着一个新的手势的开始,aciton_up意味着一个手势的结束;
- 事件由activity的dispatchevent开始,通过调用子view(包括viewgroup)的dispatchevent向下传递,直到为一个view为止;
- 之后事件会由最下层的view向上传递,由onTouchEvent进行处理,一直传递到activity的onTouchEvent;
- 首先框架层最先处理的是action_down事件,如果此事件在传递过程中没有被oninterceptEvent掉(返回true为阻止),那么此事件将一直传递到最下层;
- 此时事件将开始由下开始往上传递,并且如果在途中某一层(假设为D)消费掉(即onTouchEvent返回true),那么此事件将终止向上传递,并且以后事件也会通过D的dispatchEvent方法直接调用onTouchEvent方法进行处理(事件传递顺序A-B-C-D);
- 如果传递过程中没有任何onTouchEvent进行消费,那么以后此事件将直接由activity的onTouchEvent进行处理。这意味着如果你想在某一层处理手势,你务必要在该层消费action_down以确保以后可以接收到事件。
- action_down事件处理结束后将开始其它事件的处理(以下事件都是除了action_down的事件);
- 你可以在某一层的onInterceptEvent中随时决定是否终止向下传递事件,这取决于你的手势处理逻辑;onInterceptEvent之后你将永远不能在向下传递事件了。
- requestDisallowInterceptTouchEvent将阻止viewgroup对事件进行中断;
- 如果在某一层onTouchEvent处理某一事件,并进行消费掉,那么该事件将不会在向上传递;否则将继续向上传递。
其它知识介绍:
ViewConfiguration类保存了一些常量,是由框架层为我们生成的。
1.其中getScaledTouchSlop 确定是否在滑动
2.fling,是否快速滑动
3.其它自己研究去吧。
目前先介绍到这里,后续在更新!
时间: 2024-10-10 10:00:05