2015-11-24 17 views
43

Trong ứng dụng của tôi, tôi mở rộng hoặc ký hợp đồng AppBarLayout trên một sự kiện cụ thể bằng cách sử dụng setExpanded(boolean, true).Hoạt ảnh kỳ lạ của AppBarLayout.setExpanded (boolean, true) trong thư viện hỗ trợ 23.1.1

Tôi đã có kết quả tốt, với hoạt ảnh linh hoạt và linh hoạt sử dụng com.android.support:design:23.1.0, sau đó tôi cập nhật thành 23.1.1 và hoạt ảnh trở nên rất chậm và không linh hoạt chút nào.

Trong mã nguồn của android.support.design.widget.AppBarLayout, tôi xác định được vấn đề trong animateOffsetTo (dưới public static class Behavior extends HeaderBehavior<AppBarLayout>), mà trong phiên bản 23.1.0 là như thế này:

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

Và trong phiên bản 23.1.1 là như thế này :

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

Làm cách nào để thay đổi hoạt ảnh mở rộng/hợp đồng và thực hiện nhanh hơn?

+0

Thay đổi setDuration ??? ... –

+0

Bạn có chắc đây là vấn đề chính xác mà bạn đang chỉ ra không ??? – Pankaj

+0

@MicheleLacorte: Làm thế nào? Đó là mã của com.android.support:design – Nifhel

Trả lời

1

Chỉ cần cập nhật thư viện lên phiên bản 25.3.1.

Các vấn đề liên quan