【问题标题】:Transitioning fragment calls exit transition but animation is not happening过渡片段调用退出过渡,但动画没有发生
【发布时间】:2017-02-07 20:59:12
【问题描述】:

我想在从片段 A 移动到片段 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 设置动画,我想为其中的每个单独视图设置动画。 这意味着我需要使用转换 AFAIK

所以我的片段有

    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 的进入动画。

有什么想法吗?

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

【问题讨论】:

    标签: java android android-fragments transitions


    【解决方案1】:

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

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

    捕获值时要小心。 如果 start 和 end 值相同,则不会执行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多