问题描述
我有一个FAB(浮动操作按钮)
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
<android.support.design.widget.FloatingActionButton
android:id="@+id/fabButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_margin="@dimen/fab_margin"
app:layout_anchorGravity="bottom|right|end"
android:src="@drawable/img"
app:borderWidth="0dp"
/>
这个FAB位于我滚动浏览的RecycleView的顶部。 在滚动的某个阶段,我显示了SnackBar,并且一切都按所宣传的方式工作(特别是,SnackBar会移动FAB以避免阻塞。
现在,我要实现一种自定义行为,即向下滚动时要隐藏FAB的行为。
因此,我创建了一个自定义行为:
public class CustomBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
private int toolbarHeight;
public CustomBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
this.toolbarHeight = Utils.getToolbarHeight(context);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
return dependency instanceof AppBarLayout;
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
if (dependency instanceof AppBarLayout) {
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
int fabBottomMargin = lp.bottomMargin;
int distanceToScroll = fab.getHeight() + fabBottomMargin;
float ratio = (float)dependency.getY()/(float)toolbarHeight;
fab.setTranslationY(-distanceToScroll * ratio);
}
return true;
}
}
向下滚动时,这几乎隐藏了我的FAB(它与AppBarLayout一起隐藏了,所以我将其添加到我的FAB xml声明中
app:layout_behavior="com.example.CustomBehavior"
当我这样做时,FAB会正确隐藏,但是SnackBar在显示时会与其重叠。 意味着默认行为消失了...
有可能两者兼而有之吗?
1楼
您需要保留行为的本地实例,并保留默认行为。 尝试在关闭快餐栏时将默认行为设置回原先,然后在显示它时自定义行为。 就像是:
mSnackbar.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
super.onDismissed(snackbar, event);
((CoordinatorLayout.LayoutParams)mSnackbar.getView().getLayoutParams()).setBehavior(/*default behavior*/);
}
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
((CoordinatorLayout.LayoutParams)mSnackbar.getView().getLayoutParams()).setBehavior(/*your custom behavior*/);
}
});
祝好运!