web-dev-qa-db-fra.com

AppBarLayout.setExpanded (boolean, true) animation étrange dans la bibliothèque de support 23.1.1

Dans mon application, je développe ou contracte la AppBarLayout sur un événement spécifique à l'aide de setExpanded(boolean, true)

J'ai un bon résultat, avec une animation fluide et fluide utilisant com.Android.support:design:23.1.0, puis je me suis mis à jour en 23.1.1 et l'animation est devenue très lente et pas du tout vive.

Dans le code source de Android.support.design.widget.AppBarLayout, j'ai localisé le problème dans animateOffsetTo (sous public static class Behavior extends HeaderBehavior<AppBarLayout>), celui-ci dans la version 23.1.0 ressemblait à ceci: 

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();
}

Et dans la version 23.1.1, c'est comme ça: 

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();
}

Comment puis-je changer l'animation expand/contract et la rendre plus rapide? 

43
Nifhel
2
Rakesh

Il suffit de mettre à jour la bibliothèque vers la version 25.3.1.

1
Mladen Rakonjac