介绍
PageScrollView是一个继承于ViewGroup
的自定义容器类,如其名它支持ScrollView
和ViewPager
两种滑动效果。无需嵌套LinearLayout
,可支持不定宽高的子View
视图。支持水平和垂直方向的布局和手势,支持任意子View
滑动吸顶或是吸底悬停的交互。支持ViewPager
固有的PageTransform
动画和PageChangeListener
,ScrollChangeListener
等还有 View滑动时可见索引变化VisibleRangeChangeListener
接口。
更多优化自定义 ViewGroup: https://github.com/rexyren/WidgetLayout
以下给出两张 gif 示例,演示其最基本的功能: 本示例github源码地址
产生的背景
项目一中需要使用ViewPager
翻页,但交互上每页有间距且要露出相邻页的部分,滑动时还要有透明度和缩放动画。首先想到用ViewPager
的setPageMargin
和PagerAdapter
的getPageWidth
返回小于 1,虽能达到效果,然无法使选中的 Item 居中在屏幕上,就果断放弃。简阅 ViewPager 源码后结合需求写了一个自定义的PageLayout
满足了需求,它就是PageScrollView
的前身。
项目二有个视图切换的 tab
要求随视图滑动到 TitleBar
下方吸顶,当时是用FrameLayout
嵌套一个ScrollView
和一个假的副本TabLayout
同步数据和交互,并处理滑动事件来完成的。需求完成后,就捉摸着重写一个 比ScrollView
功能更强大的滑动控件,要支持任意子视图滑动悬停。
想到刚写了个PageLayout
可改进下就能兼容ScrollView
的滑动效果,读了ScrollView
源码后就开始动手写了。从此更名为PageScrollView
,真正实现了ViewPager
和ScrollView
相应一样的交互和已知接口。改善后支持水平和垂直方向的布局和手势滑动,以及设定的任意View
悬停在边缘等 。
使用场景:
- 完全可替代
ScrollView
&HorizontalScrollView
的使用场景 且少了一层LinearLayout
嵌套。 - 方便监听滑动时子 View 可见性的变化,随时知道可见 View 的索引范围。
- 当滑动视图内有某子
View
需要随滑动吸顶或是吸底时。 - 当滑动视图内部所有子
View
都要隋滑动做Transform
动画时。 - 当需要使用像
ViewPager
或是Gallery
交互,特别适合内部子视图宽高不同或不足一屏时同时滑动选中要求居中。 - 支持布局方向和滑动方向 动态随时切立即生效,且能恢复选中状态。
- 可设置滑动容器的最大宽或高时,视图内容不足父容器大小时,可强制填充到父窗口大小。