AppBarLayout.setExpanded(boolean, true)在支持库23.1.1中出现怪异动画

42

我的应用程序中,我使用setExpanded(boolean, true)方法,在特定事件上展开或收起AppBarLayout

我在使用com.android.support:design:23.1.0时得到了一个很好的结果,具有流畅的动画效果,但当我更新到23.1.1时,动画变得非常缓慢,不流畅。

android.support.design.widget.AppBarLayout的源代码中,我发现问题出在public static class Behavior extends HeaderBehavior<AppBarLayout>下的animateOffsetTo方法中,在版本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();
}

我该如何更改展开/折叠动画并加快速度?

@lifeevader 在一部手机上(Nexus 4,5.1.1) - Nifhel
更新appcompat到23.1.1版本怎么样? - tiny sunlight
有什么进展吗?我也遇到了同样的问题。 - gmemario
@Gilson 不,我放弃了,我改变了我的布局来解决这个问题 :( - Nifhel
12
这个问题在此处进行了报告,并计划在未来的库版本中修复。 - Jason Grife
显示剩余9条评论
2个回答


1

刚刚将库更新到25.3.1版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接