对于安卓官网的PageTransformer实例,看了很久,终于明白了一点,并记录于此
首先对于ViewPager的使用分为三步
1.在Activity的布局文件中加入ViewPager;
2.创建一个类,继承自FragmentStatePagerAdapter,并实现getItem()与getCount()方法;
3.将Adapter与ViewPager绑定;
对于ViewPager之间切换使用ViewPager.PageTransformer来设置动画
具体过程为自定义类并实现ViewPager.PageTransformer接口,只需要实现其中的
public void transformPage(View view, float position)方法即可;
关键在于对position的理解:
以官网的一个实例来分析:
position表示view相对于屏幕中心位置:当view位于屏幕中心是 position = 0;
当view滑动到屏幕最右边时 position = 1;
当view滑动到屏幕最左边是position = -1;
public class DepthPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.75f;
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
//以向左滑动为例,当position小于-1表示当前view的前一个view
//向右滑动时,表示当前view的前一个view的前一个view
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0f);
/**当向右滑动时,此处表示当前view的进入动画
*当向左滑动时,此处表示当前view的退出动画
*在此代码中关键在于对 view.setTranslationX(0f)方法的理解,此处我从网上找到以下解释
***每个View有它自己本身的位置,适配器ViewGroup在左右滑动的过程中,view滑动到哪里它就在哪里,
*偏移量为0就是保持当前位置不变**
大概意思就是,采用默认的滑动,view的位置跟着滑动的位置变化
*/
} else if (position <= 0) { // [-1,0]
// Use the default slide transition when moving to the left page
view.setAlpha(1f);
view.setTranslationX(0f);
view.setScaleX(1f);
view.setScaleY(1f);
/**
*向右滑动时,此处表示当前view的退出动画
*向左滑动时,此处表示后一个view的进入动画
*此处关键是对view.setTranslationX(pageWidth * -position)的理解,
*当向左开始滑动的时候(position = 1)就让view移动到屏幕正中间,当继续王座滑动,position会减小,
*通过pageWidth * -position来确保view一直处于屏幕正中间
*当向右滑动的时候,position = 0,pageWidth * - position = 0,view位于正中间,如果不设置setTranslationX(pageWidth * -position)
*的话,view会一直往右滑动,通过此设置确保view一直处于屏幕中间位置
*/
} else if (position <= 1) { // (0,1]
// Fade the page out.
view.setAlpha(1 - position);
// Counteract the default slide transition
view.setTranslationX(pageWidth * -position);
// Scale the page down (between MIN_SCALE and 1)
float scaleFactor = MIN_SCALE
+ (1 - MIN_SCALE) * (1 - Math.abs(position));
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0f);
}
}
}
对ViewPager.PageTransformer的理解,主要是要理解position的意思,并在做平移的时候要理解,如果不设置setTranslationX()方法的时候,view本身就会跟着滑动而平移的。