转换片段调用退出转换但不发生动画

时间:2017-02-07 20:59:13

标签: java android android-fragments transitions

我想在从片段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会立即消失,并且片段B的输入动画正在播放。

任何想法为什么?

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

1 个答案:

答案 0 :(得分:1)

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

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

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