In meiner App kann ich die AppBarLayout
für ein bestimmtes Ereignis mithilfe von setExpanded(boolean, true)
erweitern oder zusammenziehen.
Ich habe ein gutes Ergebnis mit einer flotten und fließenden Animation mit com.Android.support:design:23.1.0
, dann habe ich auf 23.1.1
aktualisiert und die Animation wurde sehr langsam und überhaupt nicht bissig.
Im Quellcode von Android.support.design.widget.AppBarLayout
habe ich das Problem in animateOffsetTo
(unter public static class Behavior extends HeaderBehavior<AppBarLayout>
) gefunden, das in der Version 23.1.0 so war:
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();
}
Und in der Version 23.1.1 ist das so:
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();
}
Wie kann ich die Erweiterungs-/Vertragsanimation ändern und schneller machen?
Aktualisieren Sie einfach die Bibliothek auf die Version 25.3.1.