ViewPager一屏展示多页相关

1. 要让viewPager一屏展示多页,可以通过对viewPager设置padding或margin,不管哪个,父布局都需要设置属性android:clipChildren="false",如果viewPager设置padding,还需要对viewPager设置android:clipToPadding="false"属性

接下来,先来解释下以上两个属性所代表的含义,

android:clipChildren属性:

用来指明子view是否可以在绘制超出自己布局范围的突出部分,默认为true,不能在超出自身布局范围外绘制自身突出部分,设置为false时,可以绘制出来,但突出部分不响应点击事件;

android:clipToPadding属性:

用来指明子view是否可以在padding范围内绘制,默认为true,不能在padding范围内绘制,设置为false时,可以在padding范围内绘制。

2. 多屏动画使用(中间大两边小,往中间滑放大,往两边滑缩小)

对viewPager父控件设置android:clipChildren="false",对viewPager设置左右margin,然后实现接口ViewPager.PageTransformer,在transformPage方法中实现动画,具体代码如下:

ViewPager一屏展示多页相关_第1张图片
图1

scale_max自定义,用来控制左右两边page显示的缩放倍数,这边设置的是0.75,如果需要设置两个page间的间距,可以通过属性setPageMargin来设置。

以上由于是通过margin来实现一屏多页的,那么,viewPager真正区域其实只有中间部分,对于左右两边页面仅展示,滑动是不响应的。为了解决该问题,我们可以改为对viewPager设置padding来实现一屏多页,同样,对viewPager父控件设置属性android:clipChildren="false",对viewPager设置左右padding,然后设置android:clipToPadding="false"。

运行后发现,左右两边页面确实可以滑动了,但是中间页面并没有完全铺满,而且也不居中了,这是我们打印transformPage方法中的position可以看到,左中右三页初始position并不是-1,0,1了,进入viewPager我们可以发现transformPage方法是在onPageScrolled中被调用的,见下图

ViewPager一屏展示多页相关_第2张图片
图2
ViewPager一屏展示多页相关_第3张图片
图3

可以看到,在计算position时,直接使用childLeft进行计算,并没有将paddingLeft考虑在内,从而产生了偏差,知道了问题产生的原因就好解决了,我们可以在PageTransformer中根据回调的position反计算出childLeft,将childLeft减去paddingLeft再计算出新的position,然后使用计算出新的position重新去参与动画计算即可,具体代码见下图

ViewPager一屏展示多页相关_第4张图片
图4

问题解决。

你可能感兴趣的:(ViewPager一屏展示多页相关)