package cl.monsoon.s1next.widget; import android.content.Context; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.util.AttributeSet; import android.view.View; import java.util.List; /** * Hide/show the {@link FloatingActionButton} when the dependent {@link AppBarLayout} * hides/shows. */ public final class AppBarLayoutVisibilityAwareFABBehavior extends FloatingActionButton.Behavior { public AppBarLayoutVisibilityAwareFABBehavior(Context context, AttributeSet attrs) {} @Override public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { return dependency instanceof AppBarLayout || super.layoutDependsOn(parent, child, dependency); } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) { if (dependency instanceof AppBarLayout) { if (dependency.getBottom() == 0 && child.getVisibility() == View.VISIBLE) { child.hide(); return true; } else if (dependency.getBottom() == dependency.getHeight() && child.getVisibility() != View.VISIBLE) { // update the translation Y child.setTranslationY(getFabTranslationYForSnackbar(parent, child)); child.show(); return true; } return false; } else { return super.onDependentViewChanged(parent, child, dependency); } } /** * @see android.support.design.widget.FloatingActionButton.Behavior#getFabTranslationYForSnackbar(CoordinatorLayout, FloatingActionButton) */ private float getFabTranslationYForSnackbar(CoordinatorLayout parent, FloatingActionButton fab) { float minOffset = 0; final List<View> dependencies = parent.getDependencies(fab); for (int i = 0, z = dependencies.size(); i < z; i++) { final View view = dependencies.get(i); if (view instanceof Snackbar.SnackbarLayout) { minOffset = Math.min(minOffset, view.getTranslationY() - view.getHeight()); } } return minOffset; } }