Android-----ViewPager的PageTransformer

本文介绍如何通过自定义MyPageTransformer实现ViewPager页面滑动时的缩放和平移效果,包括透明度、缩放比例及平移距离的具体计算方法。

效果

 

 

实现

具体实现就是设置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都会调用这个方法 
  title

转载于:https://www.cnblogs.com/sweep/p/8686489.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值