Android 5.0之CoordinatorLayout

        2014年6月的谷歌I/O开发者大会上,Google官方发布了Android5.0预览,并于同年12月正式发布Android5.0操作系统。对于Android来说,这是一次重大的更新,它提出了一种全新的Material Design设计风格。
今天我们就来说说5.0发布的新控件之一,它就是CoordinatorLayout

简介
Coordinator是协调的意思,那么显然CoordinatorLayout是一种协调子View的布局,它实现了多种Material Design中提到的滚动效果。

配置依赖

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

下面是它的几种用途

浮动按钮的滑动
CoordinatorLayout可以配合FloatingActionButton实现滑动效果,为底部的Snackbar留出空间。仅当浮动按钮与底部的距离小于Snackbar的高度时才会有这种滑动效果。
布局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.qn.coordinatorlayoutdemo1.MainActivity">

    <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="@android:drawable/ic_input_add"/>

</android.support.design.widget.CoordinatorLayout>

MainActivity中的浮动按钮点击事件

mFab = (FloatingActionButton) findViewById(R.id.fab);
mFab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Snackbar.make(v, "I am Snackbar!", Snackbar.LENGTH_LONG)
                .setAction("cancel", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                    }
                }).show();
    }
});

这里提到了Snackbar,它与CoordinatorLayout一样都是design库中的控件。它的出现是为了代替Toast。它的特点如下:
(1) Snackbar同一时间有且只有一个在显示
(2) Snackbar可以响应点击事件,且有且只有一个Action
(3) Snackbar位置如果有浮动按钮,不会覆盖它

Toolbar的显示与隐藏
这种效果同样是通过CoordinatorLayout作为根布局,然后将一个Toobar放进AppBarLayout容器布局,注意这里是v7包下的Toolbar,而不是ActionBar。根据谷歌官方文档,AppBarLayout必须作为是CoordinatorLayout的直接子View。最后还需要加入一个可以滚动的子View,这里使用RecyclerView。
布局如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.qn.coordinatorlayoutdemo1.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:fitsSystemWindows="true" >

        <android.support.v7.widget.Toolbar
            android:id="@+id/toobar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways"
            android:popupTheme="@style/Theme.AppCompat.Light">

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>

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

    <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="@android:drawable/ic_input_add"/>

</android.support.design.widget.CoordinatorLayout>

在布局中我们定义了AppBarLayout和滚定view的联系,在RecyclerView或者其他任意支持嵌套滚动的view中添加app:layout_behavior=”@string/appbar_scrolling_view_behavior”,它是support library包含的一个特殊的字符串资源,与AppBarLayout.ScrollingViewBehavior想匹配,用来通知AppBarLayout这个view何时发生了滚动。只要AppBarLayout里面定义的view设置了app:layout_scrollFlags属性,就会在滚动View进行的滑动的时候触发。
app:layout_scrollFlags属性有这么几个:
scroll:只有view设置这个属性值,在列表进行滚动时该view才会滚动出屏幕,否则它将一直固定在顶部。
enterAlways:无论列表滑到了什么位置,一旦向下滑动,设置该属性值的view就会出现。
enterAlwaysCollapsed:当定义了一个最小高度minHeight属性,那么View将会在到达这个最小高度时开始显示。
exitUntilCollapsed:当定义了一个最小高度minHeight属性,那么View将会到达这个最小高度时开始消失。

接下来,由于我们使用Toolbar代替ActionBar,所以我们在界面中不需要ActionBar,我们可以在styles.xml下加入一个style,然后在AndroidManifest.xml中使用。
如下:

<style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
</style>
<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">

接着在MainActivity中设置上Toolbar,代码如下:

Toolbar toolbar = (Toolbar) findViewById(R.id.toobar);
setSupportActionBar(toolbar);

关于RecyclerView的操作这里就不予给出了。
这样一来,当向上滑动列表时Toolbar就会隐藏,向下滚动时就会显示出来。

Toolbar折叠效果

需要在Toolbar外面嵌套一层ColapsingToolbarLayout
代码如下:

<android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="#30469b"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

其中:
app:contentScrim指定了toolbar收缩后的颜色
app:expandedTitleMarginStart指定了扩展后title距离左边的距离。
另外如果想要设置标题,必须把标题设置到CollapsingToolbarLayout上,设置到Toolbar上是无效的。
代码如下:

CollapsingToolbarLayout ctl = (CollapsingToolbarLayout)
                             findViewById(R.id.collapsing_toolbar_layout);
ctl.setTitle("Title");

制造视觉差效果

CollapsingToolbarLayout还可以做出更高级的动画,可以在里面放一个ImageView,当它从折叠到伸展的过程有一种渐渐淡出的效果。
代码如下:

<android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="#30469b"
            app:expandedTitleMarginStart="50dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@mipmap/bg"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toobar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"

                android:popupTheme="@style/Theme.AppCompat.Light">

            </android.support.v7.widget.Toolbar>

 </android.support.design.widget.CollapsingToolbarLayout>

其中:
app:layout_collapseMode指定了折叠的模式为视觉差效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值