【问题标题】:AppBarLayout.setExpanded(boolean, true) weird animation in support library 23.1.1AppBarLayout.setExpanded(boolean, true) 支持库 23.1.1 中的奇怪动画
【发布时间】:2025-11-28 19:35:01
【问题描述】:

在我的应用程序中,我使用 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();
}

如何更改展开/收缩动画并加快速度?

【问题讨论】:

  • 更改 setDuration???...
  • 你确定这正是你指出的问题吗???
  • @MicheleLacorte:怎么样?那是 com.android.support:design 的代码
  • @Nifhel mAnimator.setDuration(value) 将值更改为 100 或您想要的值
  • 此问题报告为here,并计划在库的未来版本中修复。

标签: android android-support-library android-support-design


【解决方案1】:
【解决方案2】:

只需将库更新到 25.3.1 版本即可。

【讨论】:

    最近更新 更多