CoordinatorLayout 实现了多种Material Design中提到的滚动效果,
使用CoordinatorLayout需要在Gradle加入Support Design Library:

compile 'com.android.support:design:22.2.1'

一、Coordonatorlayout与Snackbar:

package com.example.mac.coordinatelayoutdemo;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;public class MainActivity extends AppCompatActivity {    private FloatingActionButton btn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn = (FloatingActionButton) findViewById(R.id.fab);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "测试文字", Snackbar.LENGTH_LONG)                        .setAction("neirong", new View.OnClickListener() {                            @Override                            public void onClick(View view) {                                //这里的单击事件代表点击消除Action后的响应事件                            }                        })                        .show();            }        });    }}

MainActivity布局文件:

<?xml version="1.0" encoding="utf-8"?><android.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.support.v7.widget.RecyclerView        android:id="@+id/rvToDoList"        android:layout_width="match_parent"        android:background="#9d9d9d"        android:layout_height="match_parent"/>    <android.support.design.widget.FloatingActionButton        android:id="@+id/fab"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="bottom|right"        android:layout_margin="16dp"        android:src="@mipmap/ic_launcher"        app:layout_anchor="@id/rvToDoList"        app:layout_anchorGravity="bottom|right|end"/>    android.support.design.widget.CoordinatorLayout>

通常把CoordinatorLayout作为顶层最外的布局来控制子View布局之间的动画效果,例如,在View1的布局中通过设置behavior的属性,来与View2产生关联。所以当View2移动的时候,View1就会产生相对应的效果,想要产生什么效果就要由View1中的behavior的属性来决定的,当然这个behavior我们也可以自定义,后面会介绍的。这样CoordinatorLayout通过View1设置behavior来关联子View,使两个互相关联的View高度解耦。

二、CoordinatorLayout与AppBarLayout:
AppBarLayout继承自LinearLayout,布局方向为垂直方向。所以你可以把它当成垂直布局的LinearLayout来使用。
把ScrollView和AppBarLayout作为CoordinateLayout的子View,然后编写一个Behavior,在这个Behavior里面判断当前的操作是应该让ScrollView时刻保持在AppBarLayout之下(即只要改变AppBarLayout的位置就可以一起滑动),还是应该让ScrollView内部滚动而不让AppBarLayout位置发生变化等等这些需求,都是可以在Behavior里面处理的。你可以去针对你的ScrollView编写Behavior。然而,我们看到我们的AppBarLayout事先的功能比较复杂,如果我们自己去定义这样的效果,代码非常复杂,考虑的因素比较多,但是Android帮我们写好啦,我们直接用就可以了,这个ScrollView就是NestedScrollView,请注意,它并没有继承ScrollView,它继承的是FrameLayout,但是它实现的效果把它可以看成是ScrollView。
例如,

.support.v4.widget.NestedScrollView    android:layout_width="match_parent"    android:layout_height="wrap_content"    app:layout_behavior="@string/appbar_scrolling_view_behavior">//这里可以放想要滚动的内容    "match_parent"        android:layout_height="wrap_content"        android:text="aaaa" />.support.v4.widget.NestedScrollView>

当CoordinatorLayout发生滑动手势的时候,AppBarLayout的子View通过设置app:layout_scrollFlags的属性,一共有四种,可是设置为不同的滑动效果。
①scroll:如果想将所有的View能滚动出屏幕,必须设置个flag,若没有设置flag的View,则会被固定在屏幕顶部。

例如:
MainActivity中:

import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;/** * Created by mac on 16-7-24. */public class TestActivity extends AppCompatActivity {    private Toolbar toolbar;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        toolbar = (Toolbar) findViewById(R.id.toolbar);        toolbar.setTitle("标题");    }}

MainActivity的布局文件:

<?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"    android:layout_width="match_parent"    android:layout_height="match_parent">    .support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">        .support.v7.widget.Toolbar            android:id="@+id/toolbar"            android:layout_width="match_parent"            android:layout_height="?android:attr/actionBarSize"            android:background="?attr/colorPrimary"            app:layout_scrollFlags="scroll" />    .support.design.widget.AppBarLayout>    .support.v4.widget.NestedScrollView        android:layout_width="match_parent"        android:layout_height="wrap_content"        app:layout_behavior="@string/appbar_scrolling_view_behavior">        "match_parent"            android:layout_height="wrap_content"          android:text="aaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\n" />    .support.v4.widget.NestedScrollView>.support.design.widget.CoordinatorLayout>

②enterAlways:设置这个flag时,向下的滚动都会导致该view变为可见,启用快速“返回模式”。当ScrollView往下滚动时,该View会直接往下滚动。而不用考虑ScrollView是否在滚动。
例如:
与第一个不同的xml文件中,

<?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"    android:layout_width="match_parent"    android:layout_height="match_parent">    .support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">        .support.v7.widget.Toolbar            android:id="@+id/toolbar"            android:layout_width="match_parent"            android:layout_height="?android:attr/actionBarSize"            android:background="?attr/colorPrimary"            app:layout_scrollFlags="scroll|enterAlways" />    .support.design.widget.AppBarLayout>    .support.v4.widget.NestedScrollView        android:layout_width="match_parent"        android:layout_height="wrap_content"        app:layout_behavior="@string/appbar_scrolling_view_behavior">        "match_parent"            android:layout_height="wrap_content"            android:text="aaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\n" />    .support.v4.widget.NestedScrollView>.support.design.widget.CoordinatorLayout>

③enterAlwaysCollapsed:在ScrollView往上滑动时,首先是View把滑动事件“夺走”,由View去执行滑动,直到滑动最小高度后,把这个滑动事件“还”回去,让ScrollView内部去上滑。
例如,
与上面不同的是xml文件中,(图中将高度设的比较大:200dp,并将最小高度设置为?android:attr/actionBarSize):

<?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"    android:layout_width="match_parent"    android:layout_height="match_parent">    .support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">        .support.v7.widget.Toolbar            android:id="@+id/toolbar"            android:layout_width="match_parent"            android:layout_height="200dp"            android:background="?attr/colorPrimary"            android:minHeight="?android:attr/actionBarSize"            app:layout_scrollFlags="scroll|exitUntilCollapsed" />    .support.design.widget.AppBarLayout>    .support.v4.widget.NestedScrollView        android:layout_width="match_parent"        android:layout_height="wrap_content"        app:layout_behavior="@string/appbar_scrolling_view_behavior">        "match_parent"            android:layout_height="wrap_content"            android:text="aaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\n" />    .support.v4.widget.NestedScrollView>.support.design.widget.CoordinatorLayout>

④exitUntilCollapsed:是enterAlways的附加选项,一般跟enterAlways一起使用,它是指,View在往下“出现”的时候,首先是enterAlways效果,当View的高度达到最小高度时,View就暂时不去往下滚动,直到ScrollView滑动到顶部不再滑动时,View再继续往下滑动,直到滑到View的顶部结束。
例如,
与上面不同的是xml文件,需要设置一个最小的高度和最大高度,(图中将高度设的比较大:200dp,并将最小高度设置为?android:attr/actionBarSize):

<?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"    android:layout_width="match_parent"    android:layout_height="match_parent">    .support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">        .support.v7.widget.Toolbar            android:id="@+id/toolbar"            android:layout_width="match_parent"            android:layout_height="200dp"            android:background="?attr/colorPrimary"            android:minHeight="?android:attr/actionBarSize"            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed" />    .support.design.widget.AppBarLayout>    .support.v4.widget.NestedScrollView        android:layout_width="match_parent"        android:layout_height="wrap_content"        app:layout_behavior="@string/appbar_scrolling_view_behavior">        "match_parent"            android:layout_height="wrap_content"            android:text="aaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\naaaa\n" />    .support.v4.widget.NestedScrollView>.support.design.widget.CoordinatorLayout>

三、CoordinatorLayout与CollapsingToolbarLayout:
CollapsingToolbarLayout的作用提供了一个可以折叠的Toolbar,对Toolbar进行再次包装的ViewGroup,继承FragmentLayout,它需要放在AppBarLayout布局里面,并且作为AppBarLayout的直接子View。CollapsingToolbarLayout主要包括几个功能:
①:折叠Title(Collapsing title):当布局内容全部显示出来时,title是最大的,但是随着View逐步移出屏幕顶部,title变得越来越小。你可以通过CollapsingToolbarLayout调用setTitle函数来设置title。

②:内容纱布(Content scrim):根据滚动的位置是否到达一个阀值,来决定是否对View“盖上纱布”。可以通过setContentScrim(Drawable)来设置纱布的图片.ToolBar被折叠到顶部固定时候的背景,你可以调用setContentScrim(Drawable)方法改变背景或者 在属性中使用 app:contentScrim=”?attr/colorPrimary”来改变背景。

③:状态栏纱布(Status bar scrim):根据滚动位置是否到达一个阀值决定是否对状态栏“盖上纱布”,你可以通过setStatusBarScrim(Drawable)来设置纱布图片,调用方法setStatusBarScrim(,l)设置状态栏的背景,但是只能在LOLLIPOP设备上面有作用。这个只能在Android5.0以上系统有效果。

④ollapseMode :子视图的折叠模式,在子视图设置,有两种,想要明确的看到效果可以给Toolbar设置一个背景颜色
(1)“pin”:固定模式,在折叠的时候最后固定在顶端;
(2)“parallax”:视差模式,在折叠的时候会有个视差折叠的效果。我们可以在布局中使用属性app:layout_collapseMode=”parallax”来改变:

(1):将子View位置固定(Pinned position children):子View可以选择是否在全局空间上固定位置,这对于Toolbar来说非常有用,因为当布局在移动时,可以将Toolbar固定位置而不受移动的影响。 将app:layout_collapseMode设为pin。

(2):视差滚动子View(Parallax scrolling children):子View可以选择在当前的布局当时是否以“视差”的方式来跟随滚动。(:其实就是让这个View的滚动的速度比其他正常滚动的View速度稍微慢一点)。将布局参数app:layout_collapseMode设为parallax,值的范围[0.0,1.0],值越大视察越大。

例如:
MainActivity:

package com.example.mac.coordinatelayoutdemo;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.design.widget.AppBarLayout;import android.support.design.widget.CollapsingToolbarLayout;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;/** * Created by mac on 16-7-25. */public class CollapsingToolbarLayoutActivity extends AppCompatActivity {    private Toolbar toolbar;    private CollapsingToolbarLayout collapsingToolbarLayout;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        toolbar = (Toolbar) findViewById(R.id.toolbar);        collapsingToolbarLayout =(CollapsingToolbarLayout)findViewById(R.id.ctl);        //在此设置标题,可以随着View的滑动而伸缩        collapsingToolbarLayout.setTitle("标题");    }}

MainActivity的布局文件:

<?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"    android:layout_width="match_parent"    android:layout_height="match_parent" >    .support.design.widget.AppBarLayout        android:id="@+id/abl"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">        .support.design.widget.CollapsingToolbarLayout            android:id="@+id/ctl"            android:layout_width="match_parent"            android:layout_height="wrap_content"            app:expandedTitleMarginEnd="64dp"            app:expandedTitleMarginStart="48dp"            app:layout_scrollFlags="scroll|exitUntilCollapsed">            "@+id/iv"                android:layout_width="match_parent"                android:layout_height="300dp"                android:scaleType="centerCrop"                android:src="@mipmap/baby"                app:layout_collapseMode="parallax" />            .support.v7.widget.Toolbar                android:id="@+id/toolbar"                android:layout_width="match_parent"                android:layout_height="?android:attr/actionBarSize"                app:layout_collapseMode="pin"  />        .support.design.widget.CollapsingToolbarLayout>    .support.design.widget.AppBarLayout>    .support.v4.widget.NestedScrollView        android:layout_width="match_parent"        android:layout_height="wrap_content"        app:layout_behavior="@string/appbar_scrolling_view_behavior">        "match_parent"            android:layout_height="wrap_content"            android:text="aaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\naaa\n"            android:textSize="20sp" />    .support.v4.widget.NestedScrollView>.support.design.widget.CoordinatorLayout>

本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!

更多相关文章

  1. Android 5.0新控件 AppBarLayout | 嵌套布局 介绍及使用详情
  2. 记录状态栏与布局重合,状态栏颜色问题
  3. 第九节(Activity布局初步二--嵌套布局)
  4. android tabHost布局之一 不继承TabActivity并以布局文件进行布
  5. Android ListView 分类显示(二)多布局显示
  6. Android SeekBar样式修改实现签到效果
  7. Android selector控制TextView和Button按下效果
  8. android 自己实现qqminihd 左右滑动菜单效果
  9. Android实现textview文字滚动显示(跑马灯效果)

随机推荐

  1. android语音识别demo
  2. Android(安卓)dp转px
  3. android SwipeRefreshLayout 下拉刷新控
  4. 如何去掉listview黑边问题
  5. Android(安卓)Sharepreferrence 保存数据
  6. android多点触摸demo
  7. API 23 view.View——属性分析
  8. Android(安卓)实时网路监测类 步骤一(Net
  9. android 得到手机MAC
  10. Android(安卓)加密解密字符串