gpt4 book ai didi

java - 过渡 fragment 调用退出过渡但动画没有发生

转载 作者:行者123 更新时间:2023-11-30 00:43:58 26 4
gpt4 key购买 nike

我想在从 fragment A 移动到 fragment B 时有一个自定义动画

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content, fragmentA).commit();

稍后

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content, fragmentB).addToBackStack(null).commit();

我不能使用 ft.setCustomAnimations() 因为这会为整个 fragmentA 设置动画,我想为其中的每个单独 View 设置动画。这意味着 AFAIK 我需要使用转换

所以我的 fragment 有

    Transition transition = new MyTransition();
setEnterTransition(transition);
setReenterTransition(transition);
//setReturnTransition(transition);
setExitTransition(transition);

这一切都很好,因为过渡在进入和退出时都运行

我的过渡类

private class MyTransition extends Transition
{
private Interpolator accelerate = new AccelerateInterpolator();
private Interpolator decelerate = new DecelerateInterpolator();
boolean entering = false;

@Override
public void captureStartValues(TransitionValues transitionValues)
{

}

@Override
public void captureEndValues(TransitionValues transitionValues)
{

}

private void showing(boolean showing)
{
if (entering == showing) return;
entering = showing;
if (entering)
{
setDuration(Application.ANIMATION_DURATION);
setInterpolator(decelerate);
}
else
{
setDuration(Application.ANIMATION_DURATION);
setInterpolator(accelerate);
}
}

@Nullable
@Override
public Animator createAnimator(@NonNull ViewGroup sceneRoot, @Nullable TransitionValues startValues, @Nullable TransitionValues endValues)
{
if (endValues != null)
{
showing(true);
View target = endValues.view;
switch(target.getId())
{
case R.id.fab:
return ObjectAnimator.ofPropertyValuesHolder(target,
PropertyValuesHolder.ofFloat("scaleX", 1f),
PropertyValuesHolder.ofFloat("scaleY", 1f));
case R.id.main_player_tools:
return ObjectAnimator.ofFloat(target, "translationX", 0);
case R.id.main_score:
return ObjectAnimator.ofFloat(target, "translationY", 0);
case R.id.main_custom:
return ObjectAnimator.ofFloat(target, "translationX", 0);
case R.id.main_dice:
return ObjectAnimator.ofFloat(target, "translationY", 0);
default:
break;
}
}
else if (startValues != null)
{
showing(false);
View target = startValues.view;
switch(target.getId())
{
case R.id.fab:
return ObjectAnimator.ofPropertyValuesHolder(target,
PropertyValuesHolder.ofFloat("scaleX", 0f),
PropertyValuesHolder.ofFloat("scaleY", 0f));
case R.id.main_player_tools:
return ObjectAnimator.ofFloat(target, "translationX", -target.getWidth());
case R.id.main_score:
return ObjectAnimator.ofFloat(target, "translationY", -target.getHeight());
case R.id.main_custom:
return ObjectAnimator.ofFloat(target, "translationX", target.getWidth());
case R.id.main_dice:
return ObjectAnimator.ofFloat(target, "translationY", target.getHeight());
default:
break;
}
}

return null;
}
}

使用调试器运行代码似乎正确进行:

当启动 fragmentA 时,我看到代码进入 createAnimator 并相应地创建每个动画师。当启动 fragmentB 时,一切似乎都执行得很好。但是在手机上我只能看到进入动画。当它要开始退出动画时,fragmentA 立即消失,fragmentB 的进入动画正在播放。

有什么想法吗?

我尝试增加退出动画的持续时间,但无济于事。

最佳答案

原因是我没有捕获值,也没有覆盖 getTransitionProperties。

这导致 isTransitionRequired 返回 false 并导致动画被忽略。

捕获值时要小心。如果起始值和结束值相同,则不会执行转换。

关于java - 过渡 fragment 调用退出过渡但动画没有发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42099887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com