Chinaunix首页 | 论坛 | 博客
  • 博客访问: 484247
  • 博文数量: 158
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 904
  • 用 户 组: 普通用户
  • 注册时间: 2016-10-10 11:17
文章分类

全部博文(158)

文章存档

2018年(74)

2017年(84)

我的朋友

分类: Android平台

2017-12-28 14:05:47

引言在移动开发中,我们往往会在同一个界面中出现内外两层或者多层同时滑动的现象,这个时候往往会出现滑动冲突.面对滑动冲突很多开发人员可能一开始都会不知道从哪里入手,即便稍微有点思路,可能也要费点时间才能解决.其实滑动冲突的解决是有一定的套路的,本文主要针对Android开发中几种常见的滑动冲突及对应的解决方案来进行讲解。

一、常见的滑动冲突场景

目前常见的滑动冲突主要可以分为以下三种来概括:

1.外部滑动方向和内部View的滑动方向不一致,即View层的滑动方向是互相垂直的,比如Scroll View嵌套View Pager,如图1-1所示;

2.外部滑动方向和内部View的滑动方向是一致的,即view层的滑动方向互相平行,比如Scroll View嵌套List View,或者是Scroll View嵌套自己,如图1-2所示;

3.外部滑动方向与内部滑动方向即有相同的又有垂直的,也就是以上两种情况的综合出现,这种情况是算比较复杂的一种情况,如图1-3所示:

image001.jpg

 

二、常见滑动冲突的处理思路

滑动冲突看起来比较棘手,特别像场景3的那种嵌套好几层的滑动冲突;不管滑动冲突多么的复杂,它主要涉及到的都是一些触摸事件的分发和拦截,有一定的处理规则在里面,根据规则来选择合适的方法来进行处理;

1.常用的冲突解决的两种基本思路

(1).外部拦截法

即重写父容器的onInterceptTouchEvent方法,根据父容器是否需要拦截这个事件来返回对应的布尔值,如果父容器需要拦截这个触摸事件则返回true,如果不拦截则返回false;

image002.jpg

图2-1

(2).内部拦截法

即父容器不拦截任何的事件,将对应的事件传递给子元素,根据子元素是否需要消耗这个触摸事件来进行处理,如果子元素不消耗此事件,又会交由父容器来进行对应的处理,子容器需要做如图2-2处理,父容器需要做如图2-3所示处理;

image003.jpg

图2-2

image004.jpg

图2-3

三、几种滑动冲突的具体解决方式

1.对于上图1-1的滑动冲突解决方式

假设我们现在定义一个左右可以滑动的Horizontal ScrollView中加入三个竖直滑动的ListView;

(1).采用外部拦截的方式

具体的实现方式和上述图2-1的伪代码基本上差不多,首先在ACTION_DOWN中判断外部ViewGroup是否滑动到了边界,到边界则不再拦截,在滑动的时候父容器通过判断X,Y方向滑动的距离来确定是否需要拦截事件,具体实现如图3-1,3-2两种不同的方式:

image005.jpg

图3-1

 

(2).采用内部拦截的方式

image006.jpg

图3-2

 

2.对于上图1-2的滑动冲突解决方式

对于这种模式,我们需要结合实际的业务来进行相关的处理,假设现在有一个继承Linearlayout上下滑动的父容器ScrollLayout,在它里面放置了一个Header和一个ListView,从而会出现上下滑动的一个冲突,假设以下是需要实现的业务逻辑:

(1).当触摸事件在Header中的时候由父容器处理触摸事件

(2).当ListView滑动到顶部或者是底部的时候由父容器处理触摸事件

(3).除了以上情况除外,都是ListView来处理触摸事件

此处只通过外部拦截的方式来讲解具体的实现方式:

image007.jpg

图3-3

3.对于上图1-3的滑动冲突解决方式

这种情况其实是上面两种情况的一个综合,具体解决的方式就是将冲突分解为上面的两种情况来进行对应的处理,所以这里不做详解的说明;

四、总结

View的滑动冲突在开发过程中经常遇到,本文就基本的三种滑动冲突的基本解决思路和具体的解决方式来进行讲解;在理解本文之前需要对自定义View的绘制流程及事件的分发机制有一定的了解;通过本片文章,让大家在日后遇到滑动冲突的时候能够快速的找到对应的解决思路,从而提高开发的效率;


阅读(4060) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~