利用CoordinatorLayout来实现控件的矢量移动

本文介绍如何使用CoordinatorLayout实现随内容滑动而收缩的顶部布局,并保持内容可继续滑动的效果。通过自定义Behavior类,实现了控件的矢量移动效果。

最近遇到个随着内容滑动,收缩顶部,最后顶部固定,内容继续可以滑动的需求,其中还有个控件的位移。

一开始就准备直接用CollapsingToolbarLayoutCoordinatorLayout来写,但是后来发现简单的使用不能满足我们的需求,于是研究了一下CoordinatorLayout来实现了控件的矢量移动的效果,先上图。

这里写图片描述

主要就是下面的布局可以滑动,上面的连接图标会根据下面布局的位置移动到指定的位置。

先说CoordinatorLayout,这是一个主要用来协调内部子布局的控件。先了解他的两个概念,childdependencychild为子空间,在xml里为child设置layout_behavior属性,来让child跟随dependency移动。

所以说了一堆废话,最主要的就是layout_behavior属性了啊这里写图片描述

一般在网上找到的我们滑动内容View折叠AppBarLayout时候,都会在NestedScrollView里面设置layout_behavior的值为“@string/appbar_scrolling_view_behavior”,这里指定的是系统默认的一个Behavior,我们需要自己来写一个Behavior类。

//T是我们需要的Child的类
public class MyBehavior extends CoordinatorLayout.Behavior<T> {
    private Context mContext;
    public MyBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
        DisplayMetrics display = context.getResources().getDisplayMetrics();
        mContext = context;
    }
    /**
    *  这里主要需要实现的两个方法,一个是layoutDependsOn,一个是onDependentViewChanged
    * 第一个方法是用来确认是否需要关注该View的移动,返回true表示需要,返回false则忽略,绑定了
    * dependency之后,当Dependent发生了变化,便会执行onDependentViewChanged
    **/
    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, T child, View dependency) {
        return dependency instanceof AppBarLayout;
    }
    /**
    *这个方法主要就是我们需要执行的代码
    *之后在这个方法里面进行setPosition就好了
    **/
    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, T child, View dependency) {
        return true;
    }
}

之后在需要的Child控件里面设置layout_behavior属性就可以了。
中间遇到几个小坑,第一次写的时候,没有给MyBehavior写构造方法,导致报错。其次是dependency 是只能获取到CoordinatorLayout 里面的第一层级的View 而我们要操作的View,是在AppBarLayout 内部,一开始试了很多种方法都失败了,最后突然醒悟,吧AppBarLayout 设置为Child,在AppBarLayout 里面findViewByID 再对找到的View进行设置。

控件的矢量移动主要就是一个矢量之间关系的计算,先算好我们需要移动的控件位置和dependency 之间的函数关系,再根据dependency 的位置来重新setLayoutParams 就可以了。

一开始还想要直接把要移动的控件作为child 来跟随NestedScrollView ,但是好像在NestedScrollViewlayout_behavior 中,AppBarLayout完全收缩了之后会把AppBar直接放在最上层,导致我们的View被覆盖掉。

使用CoordinatorLayout 的好处在于,我们只需要写好我们需要的MyBehavior 就可以了,不需要在其他代码中进行关注,有效的进行了解耦。

源码应用在FragmentConn
的布局里面,自定义的BeHaviorcom.xiaohong.wifikulian.utils.view 目录下,源码地址:

https://github.com/xiaoawl/WifiKulian

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值