2015-11-24 27 views
43

Nella mia app espongo o contratto lo AppBarLayout su un evento specifico utilizzando setExpanded(boolean, true).Animazione appBarLayout.setExpanded (booleano, vero) strana nella libreria di supporto 23.1.1

Ho ottenuto un buon risultato, con un'animazione scattante e fluida utilizzando com.android.support:design:23.1.0, quindi ho aggiornato a 23.1.1 e l'animazione è diventata molto lenta e non scattante affatto.

Nel codice sorgente di android.support.design.widget.AppBarLayout, ho individuato il problema in animateOffsetTo (sotto public static class Behavior extends HeaderBehavior<AppBarLayout>), che nella versione 23.1.0 è stato in questo modo:

private void animateOffsetTo(final CoordinatorLayout coordinatorLayout, 
    final AppBarLayout child, int offset) { 
    if (mAnimator == null) { 
     mAnimator = ViewUtils.createAnimator(); 
     mAnimator.setInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR); 
     mAnimator.setUpdateListener(new ValueAnimatorCompat.AnimatorUpdateListener() { 

      @Override 
      public void onAnimationUpdate(ValueAnimatorCompat animator) { 
       setHeaderTopBottomOffset(coordinatorLayout, child, 
        animator.getAnimatedIntValue()); 
      } 
     }); 
    } else { 
     mAnimator.cancel(); 
    } 
    mAnimator.setIntValues(getTopBottomOffsetForScrollingSibling(), offset); 
    mAnimator.start(); 
} 

E nella versione 23.1.1 è come questo :

private void animateOffsetTo(final CoordinatorLayout coordinatorLayout, 
    final AppBarLayout child, final int offset) { 
    final int currentOffset = getTopBottomOffsetForScrollingSibling(); 
    if (currentOffset == offset) { 
     if (mAnimator != null && mAnimator.isRunning()) { 
      mAnimator.cancel(); 
     } 
     return; 
    } 
    if (mAnimator == null) { 
     mAnimator = ViewUtils.createAnimator(); 
     mAnimator.setInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR); 
     mAnimator.setUpdateListener(new ValueAnimatorCompat.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimatorCompat animator) { 
      setHeaderTopBottomOffset(coordinatorLayout, child, 
        animator.getAnimatedIntValue()); 
      } 
     }); 
    } else { 
     mAnimator.cancel(); 
    } 
    // Set the duration based on the amount of dips we're travelling in 
    final float distanceDp = Math.abs(currentOffset - offset)/
     coordinatorLayout.getResources().getDisplayMetrics().density; 
    mAnimator.setDuration(Math.round(distanceDp * 1000/ANIMATE_OFFSET_DIPS_PER_SECOND)); 
    mAnimator.setIntValues(currentOffset, offset); 
    mAnimator.start(); 
} 

Come posso modificare l'animazione di espansione/contratto e rendere più veloce?

+0

Cambia setDuration ??? ... –

+0

Sei sicuro che questo è esattamente il problema che stai segnalando ??? – Pankaj

+0

@MicheleLacorte: come? Questo è il codice di com.android.support:design – Nifhel

risposta

1

Basta aggiornare libreria per la versione 25.3.1.