下拉刷新和图片轮播控件事件冲突之解决办法(达到和淘宝京东同样的效果)

下拉刷新和图片轮播控件事件冲突之解决办法

最近想在项目中同时使用这两种控件:

1、android-Ultra-Pull-To-Refresh(下拉刷新)
项目地址:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
2、ConvenientBanner(广告条插件,图片轮播)
项目地址:https://github.com/saiwu-bigkoo/Android-ConvenientBanner

但尴尬的是,这两种控件不能同时兼容,说白了就是下拉刷新主要是上下的手势,广告条是左右滑动的手势,产生了冲突,特别是想切换图片的时候,同时向下滑动的话,会造成图片切换困难,这会给用户体验带来很大的不便。

一、分析原有的事件分发过程:

首先看一下布局文件Layout,比较简单PtrClassicFrameLayout嵌套了一个ConvenientBanner,也就是ViewGroup里面含有一个View。
android-Ultra-Pull-To-Refresh的PtrClassicFrameLayout的dispatchTouchEvent开始分发,然后ConvenientBanner的dispatchTouchEvent会交给自己的onTouchEvent,最后PtrClassicFrameLayout类会调用自己onTouchEvent。
两个onTouchEvent同时接收事件的话会产生冲突了。

二、修改分发流程

如何让这两个类不产生冲突效果呢,那就需要判断事件的归属,当我们在ConvenientBanner上面开始左右滑动的时候,PtrClassicFrameLayout不应该接收该事件,全部交给ConvenientBanner进行处理。
分析起来简单,但改起来确实问题重重,我一开始尝试将判断左右的事件的onScrool方法截获,当判断左右滑动的时候,截获事件交给,然后遇到以下问题:

  • 左右滑动的过程中(完成一次手势:从action down到up)出现垂直滑动的现象,事件依然会分发给PtrClassicFrameLayout,也就是需要知道用户已经开始滑动ConvenientBanner了,如果中途出现任何其它事件都应该交给ConvenientBanner,其余事件不能进行处理;
  • ConvenientBanner处理的时候,PtrClassicFrameLayout依然传播下来的事件;

总而言之,需要解决以下问题:

  • 如何判断垂直事件还是水平事件
  • 如何判断用户点击的范围在ConvenientBanner范围里;
  • 如何判断用户的一次点击事件

三、依次解决问题

对于问题一:

安卓有一个GestureDetector和GestureDetector.OnGestureListener接口,将此类放入
dispatchTouchEvent方法然后调用detector.onTouchEvent(e) 即可截获,接口里面有一个类onScroll方法可以完整滑动的距离,onScroll方法的原型
distanceX和distanceY告诉的是一次滑动的距离,从两个值的绝对值大小可以知道是水平滑动还是垂直滑动。

对于问题二:

这篇文章给我一个思路http://dengyin2000.iteye.com/blog/2232210,当确定触摸到ConvenientBanner后调用PtrClassicFrameLayout。requestDisallowInterceptTouchEvent(true)方法,让PtrClassicFrameLayout不再处理事件,这样问题就解决了。

对于问题三:

我直接加入一个Flag,当第一次滑动是水平的时候,我会给一个标记,之后的所有事件都会分发给ConvenientBanner,结束条件是ActionUp事件被触发后。

四、总结

再复杂的问题都是由简单的问题构成的,将这些问题各个击破,最后答案就出来了,附上一张最终的效果图,最终效果就和淘宝京东广告条的效果达成一致了,本项目已经开源,我的GitHub下载地址:https://github.com/LiuTaw/PullToRefresh-AdBannerDemo

下拉刷新和图片轮播控件事件冲突之解决办法(达到和淘宝京东同样的效果)_第1张图片
下拉刷新和图片轮播控件事件冲突之解决办法(达到和淘宝京东同样的效果)_第2张图片

你可能感兴趣的:(安卓系统编译,安卓问题解决)