ViewPager的PageTransformer和transformPage方法详解

通过PageTransformer这个接口可以实现ViewPager在滑动的时候的一些动画效果。PageTransformer接口只有一个transformPage方法。

 void transformPage(@NonNull View page, float position);

这个方法第一个参数表示当前正在滑动的页面,第二个参数就比较难以理解了。不过没关系,特地画了图来解释。
在我们第一次加载ViewPager没有滑动的情况下,page0是位于position0到position1之间。位于position0到position1之间的视图我们称为可见视图
在这里插入图片描述

在这种情况下,我们手指向左划。就变成了下图的样子。这时候page1变成了可见视图。因为他位于position0到position1之间。原来的page0变成了预可见视图, 预可见视图其实是看不见的。但有机会(左划或者右划)成为可见视图。
在这里插入图片描述

在这个过程中,page0的左边的position从0变成-1(输出很多次,log会打印出变化的过程),page1的左边的position从1变为0。page2和page3是不会打印的,因为她们完全不可见。
我们可以通过下面的代码进行验证:
page.getTag()的值我们可以在PagerAdapter的instantiateItem方法里面设置。值可以设置为"page"+position,如下。

public class AlphaTransform implements ViewPager.PageTransformer {
    @Override
    public void transformPage(@NonNull View page, float position) {
           Log.d("AlphaTransform", page.getTag()+" position:" + position);
    }
}
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
     View  pageView = View.inflate(mContext, R.layout.viewpager_item, null);
        //其它代码
        pageView.setTag("page"+position);
        return pageView;
    }
//大量输出
page0 position:-0.99583334
page1 position:0.0027777778
page0 position:-0.99722224
page1 position:0.0013888889
page0 position:-0.9986111
page1 position:0.0
page0 position:-1.0

接下来进行非常重要的一步,向左再滑动一个页面,变成下面的样子。这时候可见视图变成了page2,而最开始是可见视图的page0在经过两次左划页面后,现在已经变成了完全不可见视图。在这个过程中,page0的position从-1,变成-2。一旦log打出-2,page0就变成了完全不可见视图。变成-2之后,page0的position就再也不会输出了。因为transformPage(@NonNull View page, float position)方法的第一个参数会传递可见视图和预可见视图的信息。而不会传递完全不可见视图的信息。可以自己打印输出一下就明白了。
在这里插入图片描述
其实只要记住一点,position指的是视图的左边位置。看图带入就行了。

在第二次向左滑动的过程中,page0,page1和page2都有内容输出。
page0的position从-1到-2
page1的position从0到-1
page2的position从1到-1
在第一次向左滑动的过程中,只有page0和page1有内容输出。

再向左划一次就变成了下图的样子。
page1从position-1变成-2.
page2从position0,变成-1,
page3从position1变成0
在这里插入图片描述
到这里左划的情况就全部完成了,接下来就是右划的过程,接着上图。下面我只给出视图,大家可以自己写出值的变化做为练习。
第一次向右滑动:
在这里插入图片描述
第二次向右滑动:
在这里插入图片描述
第三次向右滑动:
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值