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?
Thay đổi setDuration ??? ... –
Bạn có chắc đây là vấn đề chính xác mà bạn đang chỉ ra không ??? – Pankaj
@MicheleLacorte: Làm thế nào? Đó là mã của com.android.support:design – Nifhel