一.CoordinatorLayout是design包里功能最为强大的一个新控件,搭配其他控件可以实现比较复杂的动画和布局效果。
一.参考官方文档:CoordinatorLayout是一个作为顶级布局的Viewgroup,是一个加强版的framlayout,既然说了是framlayout,那么就要记住framlayout的特性,那就是CoordinatorLayout如果不使用
AppBarLayout,NestedScrollView那么他的控件就会重叠。可能会得不到你想要的结果
根据官方的谷歌文档,AppBarLayout目前必须是第一个嵌套在CoordinatorLayout里面的子view。

CoordinatorLayout还提供了layout_anchor和layout_anchorGravity属性一起配合使用,可以用于放置floating view,比如FloatingActionButton与其他View的相对位置。

<?xml version="1.0" encoding="utf-8"?>.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@android:color/white"    android:orientation="vertical">    .support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:fitsSystemWindows="true">        .support.v7.widget.Toolbar            android:id="@+id/toolbar"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:background="@color/blueStatus"            android:minHeight="?attr/actionBarSize"            app:layout_scrollFlags="scroll|enterAlways"            app:navigationIcon="?attr/homeAsUpIndicator"            app:theme="@style/Theme.AppCompat.NoActionBar">        .support.v7.widget.Toolbar>        "wrap_content"            android:layout_height="wrap_content">            

上面的代码实现了悬停的效果:

Behavior对象是用来给CoordinatorLayout的子view们进行交互用的。
Behavior接口拥有很多个方法,我们拿AppBarLayout为例。

这里还可以设置

 android:minHeight="40dip"

来控制下拉时toolbar展示的最小空间

AppBarLayout中有两个Behavior,一个是拿来给它自己用的,另一个是拿来给它的兄弟结点用的

而NestedScrollingParent的方法,也就是对CoodinatorLayout进行的一个代理(Proxy),
即CoordinatorLayout自己不对这些消息进行处理,而是传递给子view的Behavior,进行处理。

利用这样的方法,实现了view和view之间的交互和视觉的协同(布局、滑动)当用户滚动RecyclerView,AppBarLayout可以这样响应滚动事件:根据子view**滚动标志(scroll flag)来控制它们如何进入(滚入屏幕)与退出(滚出屏幕)。

Flag包括:

    *scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。*    enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。    enterAlwaysCollapsed: 顾名思义,这个flag定义的是何时进入(已经消失之后何时再次显示)。    假设你定义了一个最小高度(minHeight)同时enterAlways也定义了,那么view将在到达这个最小高度的时候开始显示,并且从这个时候开始慢慢展开,当滚动到顶部的时候展开完。                  exitUntilCollapsed: 同样顾名思义,这个flag时定义何时退出,当你定义了一个minHeight,这个view将在滚动到达这个最小高度的时候消失。snap:会使子控件有自定贴靠向最终动画的功能

注意一点:所有使用scroll flag的view都必须定义在没有使用scroll flag的view的前面,这样才能确保所有的view从顶部退出,留下固定的元素。

需要注意的是,后面两种模式基本只有在CollapsingToolbarLayout才有用,而前面两种模式基本是需要一起使用的,也就是说,这些flag的使用场景,基本已经固定了。
例如我们前面例子中的,也就是这种模式:

app:layout_scrollFlags=scroll|enterAlways

PS : 所有使用scroll flag的view都必须定义在没有使用scroll flag的view的前面,这样才能确保所有的view从顶部退出,留下固定的元素。

然后,我们需要定义AppBarLayout与滚动视图之间的联系。在RecyclerView或者任意支持嵌套滚动的view比如NestedScrollView上添加app:layout_behavior。support library包含了一个特殊的字符串资源@string/appbar_scrolling_view_behavior,它和AppBarLayout.ScrollingViewBehavior相匹配,用来通知AppBarLayout 这个特殊的view何时发生了滚动事件,这个behavior需要设置在触发事件(滚动)的view之上。

.support.v7.widget.RecyclerViewandroid:id="@+id/rvToDoList"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior">

当CoordinatorLayout发现RecyclerView中定义了这个属性,它会搜索自己所包含的其他view,看看是否有view与这个behavior相关联。AppBarLayout.ScrollingViewBehavior描述了RecyclerView与AppBarLayout之间的依赖关系。RecyclerView的任意滚动事件都将触发AppBarLayout或者AppBarLayout里面view的改变。

2.CollapsingToolbarLayout:
重要属性:app:layout_collapseMode
取值:parallax:视差滚动
pin:固定在屏幕的顶部
使用app:layout_collapseParallaxMultiplier=”0.7”来设置视差因子
这是一个伸缩布局,配合CoordinatorLayout使用。

经过我的测试,CollapsingToolbarLayout应该要有toolbar才会留出一定高度的空间,若没有toolbar 将会全部收缩。

CollapsingToolbarLayout**子view**如果有属性

app:layout_collapseMode="pin"

这里使用了CollapsingToolbarLayout的app:layout_collapseMode=”pin”来确保Toolbar在view折叠的时候仍然被固定在屏幕的顶部。还可以做到更好的效果,当你让CollapsingToolbarLayout和Toolbar在一起使用的时候,title会在展开的时候自动变得大些,而在折叠的时候让字体过渡到默认值。必须注意,在这种情况下你必须在CollapsingToolbarLayout里设置Title,而不是在Toolbar上,这样折叠后的Title才会正确显示。

如果想制造toolbar的折叠效果,我们必须把Toolbar放在CollapsingToolbarLayout中:
.support.design.widget.CollapsingToolbarLayout            android:id="@+id/collapsing_toolbar"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:fitsSystemWindows="true"            app:contentScrim="?attr/colorPrimary"            app:expandedTitleMarginEnd="64dp"            app:expandedTitleMarginStart="48dp"            app:layout_scrollFlags="scroll|exitUntilCollapsed">            .support.v7.widget.Toolbar                android:id="@+id/toolbar"                android:layout_width="match_parent"                android:layout_height="?attr/actionBarSize"                app:layout_scrollFlags="scroll|enterAlways">.support.v7.widget.Toolbar>


app:layout_anchor=”@id/rvToDoList”//这个属性可以制定一个参照点控制位置
app:layout_anchorGravity=”bottom|right|end”、、控制相对于锚点的位置
app:layout_scrollFlags

最后,这是利用以上知识做的一个demo:
效果图:

补充一点,目前还没有找到很好的方法来设置 CollapsingToolbarLayout的Title 收拢后的Margin,系统只给了设置Gravity的方法,但是我知道这个方法是无法精确控制title的位置的,所以我为了让收拢的Title能靠下一些,我把toolbar的高度设置大一点,再让通知栏透明,这样就显得好看一些了。

这是源代码:
https://github.com/shangguansb/CoordinatorLayoutUserInfoShowPage
欢迎Fork 和Star!

更多相关文章

  1. Android(java)学习笔记73:线程组的概述和使用
  2. android —— 自定义控件 利用 ViewPage 实现滑动屏
  3. android之TimePicker
  4. 一段android跳转到web界面的代码
  5. Android(安卓)自定义 dialog
  6. android 开发 讯飞语音唤醒功能
  7. Android(安卓)Material Design 系列之 CoordinatorLayout + Coll
  8. Android(安卓)Studio相关配置Mac版
  9. 简单实现Android绘图板

随机推荐

  1. 在4个表上使用JOIN和GROUP BY进行复杂的S
  2. 再放100分,问:你是如何备份大于5M的mysql
  3. Visual C ++ 2010连接到MySQL
  4. MySQL -如何在最小/最大日期差异超过3年
  5. Yahoo,Msn,Skype,QQ,阿里旺旺在线聊天链
  6. 如果条件按顺序,Mysql不能使用mysql
  7. 利用TPC-H为MYSQL生成数据
  8. 如何最好地处理重复日历事件的异常
  9. mysql中逗号分隔字段的更好替代方案
  10. Mysql--可用的 MySQL 产品和专业服务