美文网首页
CoordinatorLayout踩坑

CoordinatorLayout踩坑

作者: mercuryli | 来源:发表于2018-05-23 10:59 被阅读0次

    1.CoordinatorLayout 协调者布局 

    先瞅瞅官网上怎么说的

    CoordinatorLayout

    CoordinatorLayout是一个super-powered FrameLayout 。注意:使用的时候可能会出现视图重叠的情况

    主要两个使用场景 : 1.作为最顶层的layout  2.作为一个容器与一个或者多个子view交互(特定的)

    通过给CoordinatorLayout的子View定义behavior可以做出很多特别的效果。可以在xml中设置layout_beheavior="";  这个只能是CoordinatorLayout的直接子view才能响应。有一个可以直接拿来用的behavior,app:layout_behavior="@string/appbar_scrolling_view_behavior"。这个比较有用可以将该内容放在AppBarLayout的下方,而且支持滚动。

    它的子view 可能会有一个锚点(anchor),这个锚点的id 必须和某个coordinatorlayout的子view 的一致,这个可以被用来定位一个浮动的view到另一块内容上。

    一般实现绚丽效果会将CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout结合起来使用。

    所以现在看看AppBarLayout

    2.AppBarLayout

    AppBarLayout

    AppBarLayout是一个垂直的LinearLayout,严重依赖于CoordinatorLayout,如果使用其他的父布局,会导致其很多特性失效。AppBarLayout的直接的子view可以设置layout_scrollFlags 

    3.CollapsingToolbarLayout

    CollapsingToolbarLayout

    CollapsingToolbarLayout 是FrameLayout的子类,是个实现了折叠的应用栏的Toolbar的包装类,它是作为AppbarLayout的直接子类使用的,自带跟随特点。由于继承于FrameLayout,要注意视图会覆盖的情况,要放在AppbarLayout里面使用。其直接子布局可以设定app:layout_collapseMode来设置其折叠mode。

    4.behavior

    系统自带的behavior有两种,xml中分别是app:layout_behavior="@string/appbar_scrolling_view_behavior"和app:layout_behavior="@string/bottom_sheet_behavior"

    也就是AppBarLayout.Behavior和BottomSheetBehavior前者是专门与appbarlayout一起使用实现联动的效果。

    5.自定义behavior

    布局里面确定child (观察者)和 dependency(被观察者) child 将根据dependency的行动做出相应的行动

    首先要在CoordinatorLayout 里写上child 和 dependency,child必须得写上layout_behavior

    public class TextBehaviorextends CoordinatorLayout.Behavior<ImageView>{//观察者

        public TextBehavior(Context context, AttributeSet attrs) {

                super(context, attrs);

        }

       private  int mStart;

        @Override

        public boolean onDependentViewChanged(CoordinatorLayout parent, ImageView child, View dependency) {

                    if(mStart==0){

                                mStart= (int) dependency.getY();

                        }

                    float precent=dependency.getY()/mStart;

                     child.setY(child.getHeight()*(1-precent)-child.getHeight());

                        return true;//一般在这个方法里写child 和dependency的关系

        }

        @Override

        public boolean layoutDependsOn(CoordinatorLayout parent, ImageView child, View dependency) {

                    return dependencyinstanceof TextView;//被观察者

        }

    }

    一个写的特别好的总结

    相关文章

      网友评论

          本文标题:CoordinatorLayout踩坑

          本文链接:https://www.haomeiwen.com/subject/vbzlqftx.html