效果
实现
具体实现就是设置viewpager的setPageTransformer方法,
自定义一个MyPageTransformer实现PageTransformer接口,复写接口中transformPage方法. 主要是根据position来做不同的操作
public class MyPageTransformer implements ViewPager.PageTransformer { @Override public void transformPage(View view, float position) { // 根据view获取每个page的宽高 int pageWidth = view.getWidth(); int pageHeight = view.getHeight(); // 判断当前page的position if (position < -1) { // 当下标小于-a,此时page已经看不到了,透明度为0 view.setAlpha(0); } else if (position <= 1) { // 当下标在[-a,a]区间 // 修改默认的滑动缩放 // 计算缩放比例 取(a - 当前下标的绝对值) 和 设置的比例的最大值,position最小为-a 最大为1 float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); // 根据比例计算横向和纵向的缩放结果, 根据scaleFactor计算出范围 [0,pageSize] float vertMargin = pageHeight * (1 - scaleFactor) / 2; float horzMargin = pageWidth * (1 - scaleFactor) / 2; if (position < 0) { // 当position处于[-a,0) 此时当前页面向左滑动的X轴平移距离 view.setTranslationX(horzMargin - vertMargin / 2); } else { // 当position处于[0, a] 此时当前页面向右滑动的X轴的平移距离 view.setTranslationX(-horzMargin + vertMargin / 2); } // 设置page的缩放 view.setScaleX(scaleFactor); view.setScaleY(scaleFactor); // 设置page的透明度变化 view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } else { // (a,+Infinity] // 页面离开屏幕 不可见 设置透明度为0 view.setAlpha(0); } }}
Position
这个方法里面的position并不是指ViewPager的页面的下标,而是当前页面所处位置的下标,区间是[-1,1]
当前页面可见时,position为0, 当手指向左滑动,position取值范围为[-1,0) 当手指向右滑动,position取值范围为(0,-1] 当我输出这个position的值时,发现会出现两次,推测当page可见的时候,就会计算这个值,所以当page处于滑动中,即屏幕上有两个页面同时存在时,两个page都会调用这个方法