通过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
到这里左划的情况就全部完成了,接下来就是右划的过程,接着上图。下面我只给出视图,大家可以自己写出值的变化做为练习。
第一次向右滑动:
第二次向右滑动:
第三次向右滑动: