android touch事件分发机制

  • 来源:csdn
  • 作者:zhouli_csdn
  • 字体:【
  • 时间:2015-05-23
  • 点击:
  • 收藏本文
看了网上那么多的博客 ,对于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.其它自己研究去吧。
 
目前先介绍到这里,后续在更新!
暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章
推荐文章
随机文章
关于本站 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图 - 帮助中心