web-dev-qa-db-ja.com

AppBarLayout.setExpanded(boolean、true)サポートライブラリ23.1.1の奇妙なアニメーション

私のアプリでは、setExpanded(boolean, true)を使用して特定のイベントでAppBarLayoutを展開または縮小します。

com.Android.support:design:23.1.0を使用した、きびきびとした滑らかなアニメーションで良い結果が得られました。その後、23.1.1に更新すると、アニメーションが非常に遅くなり、まったくきびきびしなくなりました。

Android.support.design.widget.AppBarLayoutのソースコードで、問題をanimateOffsetTopublic static class Behavior extends HeaderBehavior<AppBarLayout>の下)に見つけました。バージョン23.1.0では次のようになりました。

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

そして、バージョン23.1.1では次のようになります。

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

展開/縮小アニメーションを変更して作成を高速化するにはどうすればよいですか?

43
Nifhel
2
Rakesh

ライブラリを25.3.1バージョンに更新するだけです。

1
Mladen Rakonjac