package com.example.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.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
import org.alfonz.utility.ResourcesUtility;
public class SlidingFloatingActionButtonBehavior extends FloatingActionButton.Behavior
{
private int mActionBarSize;
private float mSnackbarTranslation = 0;
public SlidingFloatingActionButtonBehavior(Context context, AttributeSet attrs)
{
super(context, attrs);
mActionBarSize = ResourcesUtility.getDimensionPixelSizeValueOfAttribute(context, android.R.attr.actionBarSize);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency)
{
return super.layoutDependsOn(parent, child, dependency) ||
dependency instanceof Snackbar.SnackbarLayout ||
dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency)
{
if(dependency instanceof AppBarLayout)
{
return updateFab(child, dependency);
}
else if(dependency instanceof Snackbar.SnackbarLayout)
{
updateSnackbarTranslationField(dependency);
return super.onDependentViewChanged(parent, child, dependency);
}
else
{
return super.onDependentViewChanged(parent, child, dependency);
}
}
private boolean updateFab(FloatingActionButton child, View dependency)
{
float toolbarPosition = dependency.getY();
float fabTranslation = -(toolbarPosition * 2) - mSnackbarTranslation;
// snackbar is visible
if(mSnackbarTranslation > 0)
{
// toolbar is gone
if((-dependency.getY()) > dependency.getHeight() / 8)
{
child.setVisibility(View.GONE);
}
// toolbar is visible
else
{
child.setVisibility(View.VISIBLE);
}
}
// snackbar is gone
else
{
// toolbar is gone
if(toolbarPosition + mActionBarSize == 0)
{
child.setVisibility(View.GONE);
}
// toolbar is visible
else
{
child.setVisibility(View.VISIBLE);
}
}
ViewCompat.setTranslationY(child, fabTranslation);
return fabTranslation != 0;
}
private void updateSnackbarTranslationField(View dependency)
{
float snackbarTranslation = dependency.getHeight() - dependency.getTranslationY();
boolean isDismissed = dependency.getX() > 0 && dependency.getX() > dependency.getWidth() / 2; // is dismissed by swipe
// snackbar is gone
if(snackbarTranslation < 1 || isDismissed || dependency.getVisibility() != View.VISIBLE)
{
mSnackbarTranslation = 0;
}
// snackbar is visible
else
{
mSnackbarTranslation = snackbarTranslation;
}
}
}