fragment 淡入淡出_Fragment中的上下滑动事件会被上一个Fragment响应而不是当前的...

博主通过实现ViewPager.PageTransformer接口设置Fragment切换时的淡入淡出动画,但导致了Fragment对滑动事件的响应混乱。经过排查,发现setTranslationX()函数影响了Fragment的实际位置,进而修复了问题。删除了不必要的view.setVisibility()代码,解决了Fragment重叠显示的问题。
摘要由CSDN通过智能技术生成

问题解决了。。

有一个信息在问题中没有描述。那就是,我为了使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);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值