问题解决了。。
有一个信息在问题中没有描述。那就是,我为了使ViewPager切换page时动画为淡入淡出而不是默认的滑动,实现了ViewPager类的一个接口ViewPager.PageTransformer。然后,我在Activity中实例化这个类,并执行mViewPager.setPageTransformer(true, pageTransformer);就可以将切换动画设置成我自己写的动画。问题就出在这个动画上,一开始这个接口我是这么实现的:
import android.support.v4.view.ViewPager;
import android.view.View;
/*
*设置Fragment切换时的动画为淡入淡出
*/
public class NoSlidingPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_ALPHA = 0.0f; //最小透明度
public void transformPage(View view, float position) {
int pageWidth = view.getWidth(); //得到view宽
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left. 出了左边屏幕
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
view.setTranslationX(-pageWidth * position); //阻止页面的滑动
float alphaFactor = Math.max(MIN_ALPHA, 1 - Math.abs(position));
//透明度改变
view.setAlpha(alphaFactor);
if (alphaFactor == 0)
view.setVisibility(View.INVISIBLE); //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
else if (view.getVisibility() == View.INVISIBLE)
view.setVisibility(View.VISIBLE); //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
} else { // (1,+Infinity]
// This page is way off-screen to the right. 出了右边屏幕
view.setAlpha(0);
}
}
}
其中这一段代码是我临时用来解决问题中描述的“灵异”现象的:
if (alphaFactor == 0)
view.setVisibility(View.INVISIBLE); //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
else if (view.getVisibility() == View.INVISIBLE)
view.setVisibility(View.VISIBLE); //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
问题在哪里呢?问题就在view.setTranslationX()这个函数上,这个函数所设置的view的位置,不仅仅是视觉上的,也是实际的位置,那么看我实现的这段代码,在view离开当前界面的时候,position的值处于[-Infinity,-1]和[1,+Infinity]的时候,我并没有用setTranslationX()将其位置设置到当前界面之外,而是还是与新出现的view在同一位置,只不过由于用setAlpha()设置了透明度才看不见的。
我是怎么发现这个问题的呢?就是把这个类中的调用selAlpha()的代码全注释掉,再次运行,终于发现,当我切换Fragment的时候,会出现两个Fragment重叠显示的现象。现在我将这个类修改如下,问题解决(临时代码注释掉了):
import android.support.v4.view.ViewPager;
import android.view.View;
/*
*设置Fragment切换时的动画为淡入淡出
*/
public class NoSlidingPageTransformer implements ViewPager.PageTransformer {
public void transformPage(View view, float position) {
int pageWidth = view.getWidth(); //得到view宽
if (position <= -1) { // [-Infinity,-1]
// This page is way off-screen to the left. 出了左边屏幕
view.setTranslationX(0);
} else if (position < 1) { // (-1,1)
view.setTranslationX(-pageWidth * position); //阻止页面的滑动,位置在左则设向右偏移位置,在右则设向左偏移位置
float alphaFactor = 1 - Math.abs(position);
//透明度改变
view.setAlpha(alphaFactor);
/*
if (alphaFactor == 0)
view.setVisibility(View.INVISIBLE); //页面不在当前界面显示,则使其Invisible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
else if (view.getVisibility() == View.INVISIBLE)
view.setVisibility(View.VISIBLE); //页面在当前界面显示,则使其Visible,这句是为了解决Fragment对上下滑动事件监听的错乱,暂不知原因
*/
} else { // [1,+Infinity]
// This page is way off-screen to the right. 出了右边屏幕
view.setTranslationX(0);
}
}
}