使用 CollapsingToolbarLayout 时更改 FloatingButton 的行为
Change Behavior of FloatingButton when using CollapsingToolbarLayout
我正在开发一个应用程序,我有一个带有 CollapsingToolbarLayout
的页面和一个 ImageView
(用户的图片)代替 FloatingActionButton
。
默认行为是在 CollapsingToolbarLayout
完全隐藏时隐藏图像,但我想要不同的行为:
我希望当用户向上滚动页面时,图像继续前进,但速度很慢。所以,当它完全隐藏时,图像出现在工具栏下方,像这样(只是一个更好理解的例子):
之前:
之后:
有办法吗?
您需要扩展 CoordinatorLayout.Behavior<FloatingActionButton>
并覆盖方法 onDependentViewChanged
上的行为。
public class ScrollingFABBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
private int toolbarHeight;
public ScrollingFABBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
this.toolbarHeight = GenericUtils.getActionBarHeight(context);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
return dependency instanceof AppBarLayout || dependency instanceof Snackbar.SnackbarLayout;
}
@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 = dependency.getY() / (float) toolbarHeight;
fab.setTranslationY(-distanceToScroll * ratio);
return true;
}
if (dependency instanceof Snackbar.SnackbarLayout) {
float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
fab.setTranslationY(translationY);
return true;
}
return false;
}
}
您可以在此处查看开源应用的示例:https://github.com/nowsecure/android-vts/blob/master/app/src/main/java/fuzion24/device/vulnerability/test/ScrollingFABBehavior.java
我正在开发一个应用程序,我有一个带有 CollapsingToolbarLayout
的页面和一个 ImageView
(用户的图片)代替 FloatingActionButton
。
默认行为是在 CollapsingToolbarLayout
完全隐藏时隐藏图像,但我想要不同的行为:
我希望当用户向上滚动页面时,图像继续前进,但速度很慢。所以,当它完全隐藏时,图像出现在工具栏下方,像这样(只是一个更好理解的例子):
之前:
之后:
有办法吗?
您需要扩展 CoordinatorLayout.Behavior<FloatingActionButton>
并覆盖方法 onDependentViewChanged
上的行为。
public class ScrollingFABBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> {
private int toolbarHeight;
public ScrollingFABBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
this.toolbarHeight = GenericUtils.getActionBarHeight(context);
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton fab, View dependency) {
return dependency instanceof AppBarLayout || dependency instanceof Snackbar.SnackbarLayout;
}
@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 = dependency.getY() / (float) toolbarHeight;
fab.setTranslationY(-distanceToScroll * ratio);
return true;
}
if (dependency instanceof Snackbar.SnackbarLayout) {
float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
fab.setTranslationY(translationY);
return true;
}
return false;
}
}
您可以在此处查看开源应用的示例:https://github.com/nowsecure/android-vts/blob/master/app/src/main/java/fuzion24/device/vulnerability/test/ScrollingFABBehavior.java