viewpager 滑动切换页面的时候可以实现各种有趣的效果主要通过ViewPager.PageTransformer这个类来实现
例如:
public class MyPagerTransFormer implements ViewPager.PageTransformer {
@Override
public void transformPage(View page, float position) {
if (position == 0){
page.setAlpha(1);
}else if (position < 0){
page.setAlpha( 1 - Math.abs(position));
page.setPivotX(page.getMeasuredWidth() / 2);
page.setPivotY(page.getMeasuredHeight());
page.setRotation(20 * position);
}else if (position > 0){
page.setAlpha(1 - Math.abs(position));
page.setPivotX(page.getMeasuredWidth() / 2);
page.setPivotY(page.getMeasuredHeight());
page.setRotation(20 * position);
}
}
}
其中 transformPage 这个方法有两个参数, 第一个表示当前的页面, 第二个表示切换的时候一个进度值
当position = 0 的时候表示在当前页面也就是停在的这个页面
当我们从页面向左滑动到B页面的时候
这个时候A 从0到-1 B 从 1 到 0
我们可以通过 page.getMeasuredWidth() 和 page.getMeasuredHeight()来获取宽高做响应的变换
扩展:
我们有时候可以看到viewpager在页面上面显示一个半的这种效果
1.首先需要在viewpager 上面都加上 android:clipChildren="false" .
2.网上有资料说setClipChildren(false)在3.0以上版本中,开启了硬件加速后将不能正常工作,所以需要将其设置为软件加速。设置软硬件加速使用 setLayerType(View.LAYER_TYPE_SOFTWARE, null); 也可以在布局文件中添加 android:layerType=”software” (这个方法还没有实际去尝试过)
3.还有网上有些说要加 android:layout_marginRight 和 android:layout_marginLeft 这两个属性,这两个我尝试了过后两边留很大空白实际没有达到效果,重要的还是要重写pagerAdapter里面的
@Override
public float getPageWidth(int position) {
return (float) 0.8;
}
这个方法,返回值表示显示的比例;
但是这种方法加载到最后一页的时候 postion 的值并不能达到临界值,所以感觉不是很可取
4.记得设置setOffscreenPageLimit(3); 不然切换的时候页面显示会很突兀
5.设置setPageMargin控制两个页面之间的间隙