MD-CoodinatorLayout+AppBarLayout

CoodinatorLayout 是Google Material Design 中的一个控件,旨在解决开发中的嵌套滑动与事件分发

简介

CoordinatorLayout 继承自 ViewGroup 并实现 NestedScrollingParent 接口,是一个特殊的FrameLayout ,主要功能是协调内部的各个子控件之间的状态关系(滑动、触摸事件传递),也可以当做FrameLayout使用。
 

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_scrollFlags="scroll|enterAlways|snap" />
        </android.support.design.widget.AppBarLayout>

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_refresh"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </android.support.v4.widget.SwipeRefreshLayout>
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="16dp"
            android:src="@drawable/ic_done" />
    </android.support.design.widget.CoordinatorLayout>

Toolbar放置在了AppBarLayout里面,然后在RecyclerView中使用app: layout_behavior 属性。指定了一个布局行为layout_behavior。其中appbar_ scrolling_ view_ behavior 这个字符串也是由Design Support库提供的。

当AppBarLayout接收到滚动事件的时候,它内部的子控件其实是可以指定如何去影响这些事件的,通过app:layout_ scrollFlags 属性就能实现。 

这里在Toolbar中添加了一个app: layout_ scrollFlags 属性,并将这个属性的值指定成了 scroll| enterAlways |snap。

scroll 表示当RecyclerView向上滚动的时候,Toolbar 会 跟着一起向.上滚动并实现隐藏;

enterAlways 表示当RecyclerView向下滚动的时候,Toolbar 会 跟着一起向下滚动并重新显示。

snap表示当Toolbar还没有完全隐藏或显示的时候,会根据当前 滚动的距离,自动选择是隐藏还是显示。

注意:这里的布局行为和滚动事件怎么响应得好好研究一下。

属性解析
1.layout_scrollFlags:
scroll:孩子视图伴随滚动事件而滚出或滚进屏幕; 所有想滚动出屏幕的view都需要设置这个flag,没有设置这个flag的view将被固定在屏幕顶部。例如,TabLayout 没有设置这个值,将会停留在屏幕顶部。

enterAlways:向下滚动时Scrolling View和Child View之间的滚动优先级,当优先滚动的一方全部滚进屏幕之后,另一方才开始滚动; 设置这个flag时,向下的滚动都会导致该view变为可见,启用快速“返回模式”。

enterAlwaysCollapsed:enterAlways的附加值,这里涉及到孩子视图的高度和最小高度,向下滚动时,孩子视图会先向下滚动至最小高度值,然后Scrolling View才开始滚动,到达边界时,孩子视图再向下滚动,直至显示完全; 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。

exitUtilCollapsed:这里也涉及最小高度,发生向上滚动事件时,孩子视图向上滚动退出直至最小高度,然后Scrolling View开始滚动,也就是,Child View不会完全退出屏幕; 滚动退出屏幕,最后折叠在顶端。(可折叠的标题栏用到了这个属性)

snap:简单理解,就是Child View的一个吸附效果,也就是说,Child View不会存在局部显示的情况,滚动Child View的部分高度,当我们松开手指时,Child View 要么向上全部滚出屏幕,要么向下全部滚进屏幕,有点类似ViewPager的左右滑动。
 

原理解析
CoordinatorLayout 能实现滚动事件的处理,关键是它实现了NestedScrollingParent,能接受到子view(实现NestedScrollingChild)的滑动事件,然后再把有关滑动的信息传递给子view的behavior进行处理消费,最终实现了嵌套滑动,CoordinatorLayout在整个过程中只是相当于一个分发者,没有做任何关于嵌套滑动的事情。

实现嵌套滑动的关键是四个类(接口):

NestedScrollingChild
NestedScrollingParent
NestedScrollingChildHelper
NestedScrollingParentHelper
所以要实现嵌套滑动效果一般使用NestedScrollView或者RecyclerView等实现NestedScrollingChild接口的view。

 

layout_behavior这个可以自定义,后续得加上。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章