TabLayout


说到TabLayout,就是实现多个Tab之间的切换,Google在Design library新推出的TabLayout能实现如下三种效果:


1、固定的选项卡 (Tab的宽度平均分配)


2、Tab居中显示


3、可滚动的选项卡(Tab宽度不固定,同时可以横向滚动)


对应三种的效果图如下


  • 固定的Tab,根据TabLayout的宽度适配

Material Design的Dialogs该怎么使用 material design new tab_AppBarLayout


  • 固定的Tab,在TabLayout中居中显示

Material Design的Dialogs该怎么使用 material design new tab_android_02


  • 可滑动的Tab

Material Design的Dialogs该怎么使用 material design new tab_TabLayout_03




要实现上述效果,首先就需要加入TabLayout:


<android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#30469b"
            app:tabGravity="fill"
            app:tabMode="fixed"
            app:tabSelectedTextColor="#ff0000"
            app:tabTextColor="#ffffff" />

上面有几个参数我来详细介绍下吧,其实就是通过改变这几个参数来改变TabLayout显示效果的:


  • tabGravity  —Tab的重心,有填充和居中两个值,为别为fill和center。
  • tabMode  —Tab的模式,有固定和滚动两个模式,分别为 fixed 和 scrollable。
  • tabTextColor  —设置默认状态下Tab上字体的颜色。
  • tabSelectedTextColor  —设置选中状态下Tab上字体的颜色。
  • tabIndicatorColor — 设置指示器(滑块)的颜色。

然后在代码中动态添加Tab:


TabLayout mTabLayout = (TabLayout) findViewById(R.id.tabLayout);
        mTabLayout.addTab(mTabLayout.newTab().setText("TabOne"));//给TabLayout添加Tab
        mTabLayout.addTab(mTabLayout.newTab().setText("TabTwo"));
        mTabLayout.addTab(mTabLayout.newTab().setText("TabThree"));
        mTabLayout.setupWithViewPager(mViewPager);//给TabLayout设置关联ViewPager,如果设置了ViewPager,那么
<span style="white-space: pre;"></span><div style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;"><span style="text-align: justify;"><span style="font-family: 'Comic Sans MS'; font-size: 14px;">	</span></span></div><div style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;"><span style="text-align: justify;"><span style="font-family: 'Comic Sans MS'; font-size: 14px;"><span>	</span> 同时TabLayout结合ViewPager来实现多个Tab之间的切换。</span></span></div>
ViewPagerAdapter中的getPageTitle()方法返回的就是Tab上的标题


ViewPager设置代码:


ViewPager mViewPager = (ViewPager) findViewById(R.id.viewpager);
        MyViewPagerAdapter viewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager());
        viewPagerAdapter.addFragment(FragmentOne.newInstance(), "TabOne");//添加Fragment
        viewPagerAdapter.addFragment(FragmentTwo.newInstance(), "TabTwo");
        viewPagerAdapter.addFragment(FragmentThree.newInstance(), "TabThree");
        mViewPager.setAdapter(viewPagerAdapter);//设置适配器

然后把mViewPager设置给TabLayout即可。贴一下ViewPager适配器代码:


MyViewPagerAdapter.java


public class MyViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragments = new ArrayList<>();//添加的Fragment的集合
    private final List<String> mFragmentsTitles = new ArrayList<>();//每个Fragment对应的title的集合
    public MyViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    /**
     * @param fragment      添加Fragment
     * @param fragmentTitle Fragment的标题,即TabLayout中对应Tab的标题
     */
    public void addFragment(Fragment fragment, String fragmentTitle) {
        mFragments.add(fragment);
        mFragmentsTitles.add(fragmentTitle);
    }

    @Override
    public Fragment getItem(int position) {
        //得到对应position的Fragment
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        //返回Fragment的数量
        return mFragments.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        //得到对应position的Fragment的title
        return mFragmentsTitles.get(position);
    }
}

好了,TabLayout就介绍完了。



CollapsingToolbarLayout


CollapsingToolbarLayout包裹 Toolbar 的时候提供一个可折叠的 Toolbar,一般作为AppBarLayout的直接子视图使用。它的父类是FrameLayout。

CollapsingToolbarLayout 提供以下属性和方法是用:

  1. Collapsing title:ToolBar的标题,当CollapsingToolbarLayout全屏没有折叠时,title显示的是大字体,在折叠的过程中,title不断变小到一定大小的效果。你可以调用setTitle(CharSequence)方法设置title。
  2. Content scrim:ToolBar被折叠到顶部固定时候的背景,你可以调用setContentScrim(Drawable)方法改变背景或者 在属性中使用 app:contentScrim=”?attr/colorPrimary”来改变背景。
  3. Status bar scrim:状态栏的背景,调用方法setStatusBarScrim(Drawable)。还没研究明白,不过这个只能在Android5.0以上系统有效果。
  4. Parallax scrolling children:CollapsingToolbarLayout滑动时,子视图的视觉差,可以通过属性app:layout_collapseParallaxMultiplier=”0.6”改变。
  5. CollapseMode :子视图的折叠模式,有两种“pin”:固定模式,在折叠的时候最后固定在顶端;“parallax”:视差模式,在折叠的时候会有个视差折叠的效果。我们可以在布局中使用属性app:layout_collapseMode=”parallax”来改变。



布局代码如下:


<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><?xml version=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"1.0"</span> encoding=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"utf-8"</span>?>
<android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.CoordinatorLayout</span> xmlns:android=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://schemas.android.com/apk/res/android"</span>
    xmlns:app=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://schemas.android.com/apk/res-auto"</span>
    android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
    android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>>

    <android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AppBarLayout</span>
        android:id=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@+id/appbar"</span>
        android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
        android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"160dp"</span>>

        <android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.CollapsingToolbarLayout</span>
            android:id=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@+id/collapsing_toolbar"</span>
            android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
            android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
            app:expandedTitleMarginEnd=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"64dp"</span>
            app:contentScrim=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"?attr/colorPrimary"</span>
            app:expandedTitleMarginStart=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"48dp"</span>
            app:statusBarScrim=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"?attr/colorPrimary"</span>
            app:layout_scrollFlags=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"scroll|exitUntilCollapsed"</span>

            >

            <ImageView
                android:id=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@+id/image"</span>
                app:layout_collapseParallaxMultiplier=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"0.6"</span>
                android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
                android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
                android:scaleType=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"fitXY"</span>
                android:src=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@drawable/image"</span>
                app:layout_collapseMode=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"parallax"</span> />

            <android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.v</span>7<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Toolbar</span>
                android:id=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@+id/toolbar"</span>
                android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
                android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"?attr/actionBarSize"</span>
                app:layout_collapseMode=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"pin"</span>
                app:popupTheme=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@style/ThemeOverlay.AppCompat.Light"</span>></android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.v</span>7<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Toolbar</span>>
        </android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.CollapsingToolbarLayout</span>>


    </android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AppBarLayout</span>>

      <--your scroll content-->可滑动的内容
    <android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.v</span>4<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.NestedScrollView</span>
        android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
        android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"wrap_content"</span>
        app:layout_behavior=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@string/appbar_scrolling_view_behavior"</span>>

    </android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.v</span>4<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.NestedScrollView</span>>

    <android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.FloatingActionButton</span>
        android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"wrap_content"</span>
        android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"wrap_content"</span>
        android:src=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@drawable/ic_discuss"</span>
        app:backgroundTintMode=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"multiply"</span>
        app:layout_anchor=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@id/appbar"</span>
        app:layout_anchorGravity=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"bottom|end|right"</span>></android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.FloatingActionButton</span>>

</android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.CoordinatorLayout</span>></code>




总结: CollapsingToolbarLayout主要是提供一个可折叠的Toolbar容器,对容器中的不同视图设置layout_collapseMode折叠模式,来达到不同的折叠效果


1、Toolbar 的高度layout_height必须固定,不能 “wrap_content”,否则Toolbar不会滑动,也没有折叠效果。 
2、为了能让FloatingActionButton也能折叠且消失出现,FAB设置两个属性,两个属性共同作用才是的FAB 浮动按钮也能折叠消失,出现。

1)锚点属性 ,app:layout_anchor="@id/appbar" 表示FAB浮动按钮显示在哪个布局区域。 

2)当前锚点的位置,app:layout_anchorGravity=”bottom|end|right”,表示FAB浮动按钮在这个布局区域的具体位置。 

3、给需要有折叠效果的组件设置 layout_collapseMode属性。


AppBarLayout

效果图是这样的


Material Design的Dialogs该怎么使用 material design new tab_android_04

AppBarLayout 是继承LinerLayout实现的一个ViewGroup容器组件,它是为了Material Design设计的AppBar,支持手势滑动操作。

默认的AppBarLayout是垂直方向的,它的作用是把AppBarLayout包裹的内容都作为AppBar。类似上面图片贴出来的效果,代码布局如下:


<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AppBarLayout</span>
        android:id=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@+id/appbar"</span>
        android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
        android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"wrap_content"</span>>

        <android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.v</span>7<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Toolbar</span>
            android:id=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@+id/toolbar"</span>
            android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
            android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"?attr/actionBarSize"</span>
            android:background=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"?attr/colorPrimary"</span>
            android:minHeight=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"?attr/actionBarSize"</span>></android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.v</span>7<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Toolbar</span>>

        <android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.TabLayout</span>
            android:id=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@+id/tabs"</span>
            android:layout_width=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"match_parent"</span>
            android:layout_height=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"wrap_content"</span>
            app:layout_scrollFlags=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"scroll"</span>
            app:tabIndicatorColor=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@android:color/holo_red_dark"</span>
            app:tabSelectedTextColor=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@android:color/holo_red_dark"</span>
            app:tabTextColor=<span  style="color: rgb(0, 136, 0); box-sizing: border-box;">"@android:color/black"</span> />

    </android<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.support</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.design</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.widget</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.AppBarLayout</span>></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li></ul>


此处将Toolbar 和Tablayout的组合部分共同构成 AppBar的效果。

注意:AppBarLayout必须作为Toolbar的父布局容器,AppBarLayout是支持手势滑动效果的,不过的跟CoordinatorLayout配合使用。

接下来学习一下CoordinatorLayout组件怎么使用?


  • CoordinatorLayout 

该控件也是Design包下的一个复杂、功能最强大的控件 。 CoordinatorLayout是一个增强型的FrameLayout。它的作用有两个。

1、作为一个布局的根布局


2、 最为一个为子视图之间相互协调手势效果的一个协调布局

CoordinatorLayout 的神奇之处就在于 Behavior CoordinatorLayout 所做的事情就是当成一个通信的桥梁,连接不同的view,使用 Behavior  对象进行通信。

CoordinatorLayout 的神奇之处就在于 BehaviorCoordinatorLayout 所做的事情就是当成一个通信的桥梁,连接不同的view,使用 Behavior 对象进行通信。

即,通过app:layout_scrollFlags=”scroll|enterAlways” 属性来确定哪个组件是可滑动的。

设置的layout_scrollFlags有如下几种选项:


scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。


enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。


enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。


exitUntilCollapsed: 滚动退出屏幕,最后折叠在顶端。



为了使得Toolbar可以滑动,我们必须还得有个条件,就是CoordinatorLayout布局下包裹一个可以滑动的布局,比如 RecyclerView,NestedScrollView(经过测试,ListView,ScrollView不支持)具有滑动效果的组件。并且给这些组件设置如下属性来告诉CoordinatorLayout,该组件是带有滑动行为的组件,然后CoordinatorLayout在接受到滑动时会通知AppBarLayout 中可滑动的Toolbar可以滑出屏幕了。


比如:在CoordinatorLayout中使用AppBarLayout,如果AppBarLayout的子View(如ToolBar、TabLayout)标记了app:layout_scrollFlags滚动事件,那么在CoordinatorLayout布局里其它标记了app:layout_behavior="@string/appbar_scrolling_view_behavior"的子View(LinearLayout、RecyclerView、NestedScrollView等)就能够响应(如ToolBar、TabLayout)控件被标记的滚动事件。


总结:

  1. CoordinatorLayout必须作为整个布局的父布局容器。
  2. 给需要滑动的组件设置 app:layout_scrollFlags属性。
  3. 给你的可滑动的组件,也就是RecyclerView 或者 NestedScrollView 设置layout_behavior属性。