2017-02-07 13 views
1

Я хочу иметь пользовательскую анимацию при переходе от фрагмента А фрагменту Вфрагмент Переход вызывает переход выхода, но анимация не происходит

 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.

Любые идеи, почему?

Я пытался увеличить продолжительность анимации выхода, но безрезультатно.

ответ

1

Причина в том, что я не фиксировал значения и не переопределял getTransitionProperties.

Это вызвано isTransitionRequired для возврата false и приводит к игнорированию анимации.

Будьте внимательны при измерении значений. Если начальные и конечные значения совпадают, переход не будет выполнен.