Android 的事件分发机制

来源:互联网 发布:windows 版 kinect 编辑:程序博客网 时间:2024/05/16 20:28

Android开发多年,但是发现自己总结的东西太少了,所以想通过自己多年来的项目经验写一些,干货和大家一起分享。关于事件分发,用的最多在项目中就是父控件和子控件的事件冲突。那么遇到这个问题怎么处理呢?
这里写图片描述

我们在一个mainActivity 中加入ViewPager 然后在 ViewPager 填充2个 fragment ,当我我手势滑动到一个fragment时,我们滑动到 上面的广告栏图片时,结果跑到了第二个fragemnt 中去了, 我们需要的手势画的图片,而不跳转页面,遇到这种情况我们怎么处理呢?
其实处理起来很简单,我只需要告诉 父类的控件 ,子类控件自己处理就可以了。

ViewPager.requestDisallowInterceptTouchEvent(true);

而这个方法是哪里来的呢?
其实 requestDisallowInterceptTouchEvent 父类就是 InterceptTouchEvent
这也是我们之后要说的 Android事件分发中的 三个重要方法的
Activity.dispatchTouchEvent(MotionEvent):此方法允许 Activity 在分派给窗口之前截获所有触摸事件。
ViewGroup.onInterceptTouchEvent(MotionEvent):此方法允许 ViewGroup 监视分派给子视图的事件。
ViewParent.requestDisallowInterceptTouchEvent(boolean): 对父视图调用此方法表明不应使用 onInterceptTouchEvent(MotionEvent) 截获触摸事件。
其中的一个。

OK,说了这么多,我们来描述一下事件分发,所谓的事件分发就是用户点击手机界面 产生了很多action,action从activity 开始向各个子view 传递事件的过程,但是系统这么捕捉到时哪个view的事件呢,由此设计者,设计了一套事件传递的分配规则 这个过程就是事件分发。
说的可能有点笼统,我们下面看一下流程图。

这里写图片描述

看到这里我想大家应该明白这么回事了,也知道,关于事件分发的流程怎么走了,但是还有个问题,如果当子view 在dispatchTounchEvent 没有获取到事件会发生什么情况呢,那么这时候,Android引入了另外一种机制那就是责任链模式,当子view没有获取到事件是,那么它会重新走一遍事件分发流程,但这种情况很少出现,只有子view被回收时,才会出现这种情况。好了关于事件分发就告一段落了,你学会了吗?

[参考材料:][(https://developer.android.com/guide/topics/ui/ui-events.html#TouchMode)]

原创粉丝点击