package party.danyang.nationalgeographic.widget; import android.content.Context; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPropertyAnimatorListener; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.util.AttributeSet; import android.view.View; /** * Created by yaki on 16-7-2. */ public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior { private static final android.view.animation.Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); private boolean mIsAnimating = false; public ScrollAwareFABBehavior(Context context, AttributeSet attrs) { super(); } @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); if (dyConsumed > 0 && !mIsAnimating && child.getVisibility() == View.VISIBLE) { hide(child); } else if (dyConsumed <= 0 && child.getVisibility() != View.VISIBLE) { show(child); } } private void hide(FloatingActionButton fab) { ViewCompat.animate(fab).scaleX(0.0F).scaleY(0.0F).alpha(0.0F) .translationY(fab.getHeight()) .setInterpolator(INTERPOLATOR).withLayer() .setListener(new ViewPropertyAnimatorListener() { public void onAnimationStart(View view) { mIsAnimating = true; } public void onAnimationCancel(View view) { mIsAnimating = false; } public void onAnimationEnd(View view) { mIsAnimating = false; view.setVisibility(View.GONE); } }).start(); } private void show(FloatingActionButton fab) { fab.setVisibility(View.VISIBLE); ViewCompat.animate(fab).scaleX(1.0F).scaleY(1.0F).alpha(1.0F) .translationY(0.0F) .setInterpolator(INTERPOLATOR).withLayer().setListener(null) .start(); } }