使用 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