Я хочу иметь пользовательскую анимацию при переходе от фрагмента А фрагменту Вфрагмент Переход вызывает переход выхода, но анимация не происходит
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 (), так как это оживит весь фрагмент А, и я хочу оживить каждый отдельный вид внутри него. Это означает, 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;
}
}
Работа с отладчиком, код, как представляется, работает правильно:
При запуске фрагмента я вижу код, идущий в createAnimator и создающий каждый аниматор соответственно. При запуске фрагмента Б снова все выглядит отлично. Однако по телефону я вижу только анимацию ввода. Когда он начнет анимацию выхода, фрагментA мгновенно исчезнет и начнется анимация ввода фрагмента B.
Любые идеи, почему?
Я пытался увеличить продолжительность анимации выхода, но безрезультатно.