FloatingActionButtonBehavior: animate transitions
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
db7b61ab80
commit
6558140a7c
@ -6,13 +6,19 @@
|
|||||||
|
|
||||||
package com.wireguard.android.widget.fab;
|
package com.wireguard.android.widget.fab;
|
||||||
|
|
||||||
|
import android.animation.Animator;
|
||||||
|
import android.animation.AnimatorListenerAdapter;
|
||||||
|
import android.animation.TimeInterpolator;
|
||||||
|
import android.animation.ValueAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.design.widget.CoordinatorLayout;
|
import android.support.design.widget.CoordinatorLayout;
|
||||||
import android.support.design.widget.Snackbar;
|
import android.support.design.widget.Snackbar;
|
||||||
|
import android.support.v4.view.animation.FastOutSlowInInterpolator;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionsMenu> {
|
public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionsMenu> {
|
||||||
|
|
||||||
public FloatingActionButtonBehavior(final Context context, final AttributeSet attrs) {
|
public FloatingActionButtonBehavior(final Context context, final AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
}
|
}
|
||||||
@ -23,17 +29,39 @@ public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<Flo
|
|||||||
return dependency instanceof Snackbar.SnackbarLayout;
|
return dependency instanceof Snackbar.SnackbarLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final long ANIMATION_DURATION = 250;
|
||||||
|
private static final TimeInterpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new FastOutSlowInInterpolator();
|
||||||
|
|
||||||
|
private static void animateChange(final FloatingActionsMenu child, final float destination, final float fullSpan) {
|
||||||
|
final float origin = child.getBehaviorYTranslation();
|
||||||
|
if (Math.abs(destination - origin) < fullSpan / 2) {
|
||||||
|
child.setBehaviorYTranslation(destination);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final ValueAnimator animator = new ValueAnimator();
|
||||||
|
animator.setFloatValues(origin, destination);
|
||||||
|
animator.setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR);
|
||||||
|
animator.setDuration((long)(ANIMATION_DURATION * (Math.abs(destination - origin) / fullSpan)));
|
||||||
|
animator.addListener(new AnimatorListenerAdapter() {
|
||||||
|
@Override
|
||||||
|
public void onAnimationEnd(final Animator a) {
|
||||||
|
child.setBehaviorYTranslation(destination);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
animator.addUpdateListener(a -> child.setBehaviorYTranslation((float)a.getAnimatedValue()));
|
||||||
|
animator.start();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onDependentViewChanged(final CoordinatorLayout parent, final FloatingActionsMenu child,
|
public boolean onDependentViewChanged(final CoordinatorLayout parent, final FloatingActionsMenu child,
|
||||||
final View dependency) {
|
final View dependency) {
|
||||||
child.setBehaviorYTranslation(Math.min(0, dependency.getTranslationY() - dependency.getMeasuredHeight()));
|
animateChange(child, Math.min(0, dependency.getTranslationY() - dependency.getMeasuredHeight()), dependency.getMeasuredHeight());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDependentViewRemoved(final CoordinatorLayout parent, FloatingActionsMenu child,
|
public void onDependentViewRemoved(final CoordinatorLayout parent, final FloatingActionsMenu child,
|
||||||
final View dependency) {
|
final View dependency) {
|
||||||
// TODO(msf): animate this so it isn't so dramatic when the snackbar is swiped away
|
animateChange(child, 0, dependency.getMeasuredHeight());
|
||||||
child.setBehaviorYTranslation(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user