85 lines
2.9 KiB
Java
85 lines
2.9 KiB
Java
package com.stardust.widget;
|
|
|
|
import android.animation.Animator;
|
|
import android.animation.AnimatorListenerAdapter;
|
|
import android.animation.TimeInterpolator;
|
|
import android.content.Context;
|
|
import android.support.design.widget.CoordinatorLayout;
|
|
import android.support.design.widget.FloatingActionButton;
|
|
import android.support.v4.view.animation.FastOutSlowInInterpolator;
|
|
import android.util.AttributeSet;
|
|
import android.view.View;
|
|
|
|
/**
|
|
* Created by Stardust on 2017/8/20.
|
|
*/
|
|
|
|
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
|
|
|
|
private static final long DURATION = 200;
|
|
private static final TimeInterpolator INTERPOLATOR = new FastOutSlowInInterpolator();
|
|
private boolean mHidden = false;
|
|
|
|
public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
|
|
super();
|
|
}
|
|
|
|
@Override
|
|
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {
|
|
return true;
|
|
}
|
|
|
|
@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) {
|
|
onScrollDown(coordinatorLayout, child);
|
|
} else if (dyConsumed < 0) {
|
|
onScrollUp(coordinatorLayout, child);
|
|
}
|
|
}
|
|
|
|
private void onScrollUp(CoordinatorLayout parent, FloatingActionButton button) {
|
|
if (!mHidden) {
|
|
return;
|
|
}
|
|
startShowingAnimation(parent, button);
|
|
}
|
|
|
|
private void startShowingAnimation(CoordinatorLayout parent, FloatingActionButton button) {
|
|
button.animate()
|
|
.translationY(0)
|
|
.setDuration(DURATION)
|
|
.setListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
mHidden = false;
|
|
}
|
|
})
|
|
.start();
|
|
}
|
|
|
|
private void onScrollDown(CoordinatorLayout parent, FloatingActionButton button) {
|
|
if (mHidden) {
|
|
return;
|
|
}
|
|
startHidingAnimation(parent, button);
|
|
}
|
|
|
|
private void startHidingAnimation(CoordinatorLayout parent, FloatingActionButton button) {
|
|
button.animate()
|
|
.translationY(parent.getY() + parent.getHeight() - button.getY())
|
|
.setDuration(DURATION)
|
|
.setInterpolator(INTERPOLATOR)
|
|
.setListener(new AnimatorListenerAdapter() {
|
|
@Override
|
|
public void onAnimationEnd(Animator animation) {
|
|
mHidden = true;
|
|
}
|
|
})
|
|
.start();
|
|
}
|
|
|
|
|
|
}
|