最近遇到个随着内容滑动,收缩顶部,最后顶部固定,内容继续可以滑动的需求,其中还有个控件的位移。
一开始就准备直接用CollapsingToolbarLayout和CoordinatorLayout来写,但是后来发现简单的使用不能满足我们的需求,于是研究了一下CoordinatorLayout来实现了控件的矢量移动的效果,先上图。
主要就是下面的布局可以滑动,上面的连接图标会根据下面布局的位置移动到指定的位置。
先说CoordinatorLayout,这是一个主要用来协调内部子布局的控件。先了解他的两个概念,child和dependency,child为子空间,在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 ,但是好像在NestedScrollView 的layout_behavior 中,AppBarLayout完全收缩了之后会把AppBar直接放在最上层,导致我们的View被覆盖掉。
使用CoordinatorLayout 的好处在于,我们只需要写好我们需要的MyBehavior 就可以了,不需要在其他代码中进行关注,有效的进行了解耦。
源码应用在
FragmentConn
的布局里面,自定义的BeHavior在com.xiaohong.wifikulian.utils.view目录下,源码地址:
本文介绍如何使用CoordinatorLayout实现随内容滑动而收缩的顶部布局,并保持内容可继续滑动的效果。通过自定义Behavior类,实现了控件的矢量移动效果。
5633

被折叠的 条评论
为什么被折叠?



