Nella mia app espongo o contratto lo AppBarLayout
su un evento specifico utilizzando setExpanded(boolean, true)
.Animazione appBarLayout.setExpanded (booleano, vero) strana nella libreria di supporto 23.1.1
Ho ottenuto un buon risultato, con un'animazione scattante e fluida utilizzando com.android.support:design:23.1.0
, quindi ho aggiornato a 23.1.1
e l'animazione è diventata molto lenta e non scattante affatto.
Nel codice sorgente di android.support.design.widget.AppBarLayout
, ho individuato il problema in animateOffsetTo
(sotto public static class Behavior extends HeaderBehavior<AppBarLayout>
), che nella versione 23.1.0 è stato in questo modo:
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();
}
E nella versione 23.1.1 è come questo :
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();
}
Come posso modificare l'animazione di espansione/contratto e rendere più veloce?
Cambia setDuration ??? ... –
Sei sicuro che questo è esattamente il problema che stai segnalando ??? – Pankaj
@MicheleLacorte: come? Questo è il codice di com.android.support:design – Nifhel