Android 使用折叠工具栏布局时更改浮动按钮的行为

Android 使用折叠工具栏布局时更改浮动按钮的行为,android,behavior,android-collapsingtoolbarlayout,Android,Behavior,Android Collapsingtoolbarlayout,我正在开发一个应用程序,其中我有一个带有折叠工具栏布局的页面,以及一个图像视图(用户图片)来代替浮动操作按钮 默认行为是在折叠工具栏布局完全隐藏时隐藏图像,但我需要不同的行为: 我希望当用户向上滚动页面时,图像会继续移动,但速度很慢。因此,当它完全隐藏时,图像会显示在工具栏下方,如下所示(这只是一个更好理解的示例): 之前: 之后: 有没有办法做到这一点?您需要扩展CoordinatorLayout.Behavior并覆盖方法onDependentViewChanged上的行为 public

我正在开发一个应用程序,其中我有一个带有
折叠工具栏布局
的页面,以及一个
图像视图
(用户图片)来代替
浮动操作按钮

默认行为是在
折叠工具栏布局
完全隐藏时隐藏图像,但我需要不同的行为: 我希望当用户向上滚动页面时,图像会继续移动,但速度很慢。因此,当它完全隐藏时,图像会显示在工具栏下方,如下所示(这只是一个更好理解的示例):

之前:

之后:


有没有办法做到这一点?

您需要扩展
CoordinatorLayout.Behavior
并覆盖方法
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;
    }

}
公共类ScrollingFABBehavior扩展了CoordinatorLayout.Behavior{
私家车高度;
公共滚动行为(上下文、属性集属性){
超级(上下文,attrs);
this.toolbarHeight=GenericUtils.getActionBarHeight(上下文);
}
@凌驾
公共布尔布局依赖项(坐标布局父项、浮动操作按钮fab、视图依赖项){
返回AppBarLayout的依赖项实例| | Snackbar.SnackbarLayout的依赖项实例;
}
@凌驾
公共布尔onDependentViewChanged(CoordinatorLayout父级、FloatingActionButton fab、视图依赖项){
if(AppBarLayout的依赖项实例){
CoordinatorLayout.LayoutParams lp=(CoordinatorLayout.LayoutParams)fab.getLayoutParams();
int fabBottomMargin=lp.bottomMargin;
int distancetoscoll=fab.getHeight()+fabBottomMargin;
浮动比率=dependency.getY()/(float)工具栏高度;
工厂设置平移Y(-DistanceToCroll*比率);
返回true;
}
if(Snackbar.Snackbar布局的依赖项实例){
float translationY=Math.min(0,dependency.getTranslationY()-dependency.getHeight());
工厂设置转换Y(转换Y);
返回true;
}
返回false;
}
}

您可以在此处查看一个开源应用程序的示例:

我做了一些更改,以应用于ImageView而不是FloatingActionButton,并通过此处找到的代码获得了toolbarHeight:并且工作得非常出色!!非常感谢