前置知识
- 了解 View 的分发事件(没了解也没事)
- 有 Android 开发基础
PS:本文写给未曾遇见过滑动冲突的 Android 初学者,当然也欢迎大佬们对我指点一二☺️
前言
如果你是一名Android 新手,那么你很可能没有遇见过滑动冲突,甚至不知道滑动冲突是什么?那是因为你的业务需求可能还不够复杂,作为一名初学者,没有将多种组件结合使用,那自然就没有遇见到滑动冲突了。
但是,滑动冲突等到遇到的时候再去翻阅资料、学习处理,那么就会显得过于仓惶。所以本篇文章,我将用一个简单的案例,带你来一场与滑动冲突的完美邂逅。
PS:本篇不会尚详细展开讲解滑动冲突的各种场景和全面的解决思路,在后续的文章才会进行详细讲解。
邂逅时刻
前面我们说到,滑动冲突的出现,是基于较为复杂的组合应用场景。下面,我提出一个稍微复杂一点的需求,而这个需求直接实现之后,是会出现滑动冲突的。
需求描述是这样子的:我需要在一个页面中,展示三个榜单(电影榜,电视剧榜,综艺榜),这三个榜单分别是通过点击导航栏或者左右滑动展示出来,并且榜单可以上下滑动来查看更多的榜单数据。
根据上述的需求,我们会想到:导航栏可以使用 TabLayout
,榜单左右滑动使用 Viewpager
载入Fragment
,点击展示的话就吧 TabLayout
和 Viewpager
联动即可。最后的榜单上下滑动查看数据,我们可以在 Fragment
里面载入 NestedScrollView
做纵向的页面滚动。
想好了实现的方法,我们可以将这个功能实现出来啦,实现的效果如下:
但是当我们实现之后,我们会发现,这个功能不顺手。怎么不顺手呢?就是当我有时想下滑的时候,他变成了左右滑动了,而一般突变为左右滑动的触发点是我快速滑动的时候。我们可以看一下下方的动图。
下图中,以同样的角度滑动,慢滑动的时候,事件被子View捕获,实现的是 子View
的上下滑动。
而快速滑动的时候,事件被父布局的View捕获,实现的是外层 ViewPager2
的左右滑动。
是的,这种情况,就是滑动冲突。具体来说是,我们的左右滑动和上下滑动发送冲突了,导致软件无法判别清楚我们是想执行哪一种滑动命令。当然,上面的滑动冲突并不是很重大,不会影响业务,只会影响体验罢了。
作为一名负责人的 coder,与滑动冲突的相遇只是开始时刻,若没有产生知识的沉淀或是使得问题被解决,必然不能算一场美好的相遇啦!
所以,让我们一起来体验一把如何解决这个问题,提高用户使用体验吧。