Pich Blog

关注移动开发,大数据,云计算,软件架构!

11.View的滑动冲突

概述

滑动冲突在开发中非常常见,要解决也是一个比较棘手的问题。下面就看看有哪些常见的滑动冲突场景。

外部和内部滑动方向不一致

主要就是讲ViewPager和Fragment配合使用,用ViewPager来左右切换页面,每个页面又是fragment,里面又是一个上下滑动的页面,但是这种情况ViewPager里面解决了这个滑动冲突,所以就没有这样的问题。

但是如果外部采用的ScrollView那就需要手动处理了,如果不解决只有一层能滑动,除了这个还有外部上下滑动,内部左右滑动的情况,但他们都是一样的。

处理方法

当用户左右滑动是,让外部View拦截事件,上下滑动时让内部的View拦截。

也就是说可以根据是水平滑动还是竖直滑动到底由谁拦截。

如何判断滑动方向

  1. 可以根据滑动路径和水平方向所形成的夹角,角度小就是那个方向

  2. 水平和垂直方向的距离,那个距离大就是那个方向

  3. 还可以根据水平和垂直方向的速度来判断

解决方法

外部拦截(父类拦截)

要解决上面的问题提示很简单,我们只需要MOVE事件判断如果是水平就拦截,因为要将水平交给外层,这样外层就可以左右滚动了。我们可以在自定义的水平滚动控件的onInterceptTouchEvent方法中这样写:

这样就实现了我们想要的效果了。

内部拦截(控件自己拦截)

我们这里是外面是一个水平的ScrollView,里面每个页面是一个ListView,所以如果要以这种方式实现,就需要自定义一个ListView,然后在他的dispatchTouchEvent中处理。

可以看到我们在子类可以干预父类的事件拦截机制。同时还需要修改外层的ScrollView,让他默认拦截出ACTION_DOWN以外的事件。

这样一来也实现了我们上面想要的效果,但是这种方法可以发现还是有点麻烦。

外部滑动和内部滑动方向一致

当内外两床都在同一个方向可以滑动时,系统显然不知道你到底是滑动哪一个,所以当手指滑动时,要么只有一层滑动,要么两层都轻微滑动,在实际开发中主要指的是内外两层同时滑动。

//TOOD,这个时候需要根据实际场景来判断是否拦截,说白了和上面的代码一样,判断逻辑有多个而已。

处理方法

这种情况无法根据角度,距离差,速度来判断,只能根据业务来,比如:

当出现某种状态外部滑动,当出现另一种状态内部滑动。

上面联合嵌套

这种情况是上面的那种嵌套,场景是Activity中有一个ViewPager,ViewPager中每个是一个列表,然后在Activity中有一个SlideMenu。

处理方法

这种情况和上面一样,无法直接解决只能根据业务场景来解决。

这个情况的处理方法就是拆成上面两种。来单独处理。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注