Material Design 中怎么使用 CoordinatorLayout?

阅读时长 11 分钟读完

介绍

Material Design 是 Google 推出的一套全新的设计语言,它不仅是一种设计风格,更是对设计规范的全新定义。在 Material Design中,全新的视觉效果以及交互方式都得到了极大的重视。而 CoordinatorLayout 算是 Material Design 框架下的一种布局控件,它可以帮助开发者更加方便的实现 Material Design 设计风格。

CoordinatorLayout 简介

什么是 CoordinatorLayout?

CoordinatorLayout 是 Android Support Design 库提供的一种布局控件,它继承自 ViewGroup。在 Material Design 中,一个界面的许多元素往往需要协同工作,以达到特定的交互效果,而 CoordinatorLayout 就为此提供了比较好用的方式。

CoordinatorLayout 的优势

通过使用 CoordinatorLayout,开发者可以轻松实现许多复杂协同工作,比如惯性滚动、响应式点击、弹性动画等。同时,它还支持定制的布局管理器,而这些优点都能有效地推进应用的开发以及提高用户的体验。

CoordinatorLayout 的使用方法

基本使用

在 XML 中,我们需要把我们要协同操作的控件放在 CoordinatorLayout 之中。在 CoordinatorLayout 中,控件的顺序并不重要,但有一个重要的属性叫做 app:layout_behavior,这个属性可以决定一个控件和其他控件的关系和协同动作。当 app:layout_behavior 属性被设置之后,CoordinatorLayout 容器会自动解析一些必要的信息,然后依据这些信息进行自调整。

下面是一个简单的使用示例:

-- -------------------- ---- -------
------------------------------------------------
    ------------------------------------
    -----------------------------------
    -------------------------------------

    -------------------------------------------
        -------------------------------
        -----------------------------------
        ------------------------------------
        ----------------------------------------------

        ----------------------------------
            -------------------------
            -----------------------------------
            -------------------------------------------
            ---------------------------------------
            ---------------------------------------------

    ---------------------------------------------

    -------------------------------------------
        ------------------------------------
        -----------------------------------
        ------------------------------------
        -------------------------------------------------------------

        ---------
            -----------------------------------
            -----------------------------------
            ------------------------------------
            -----------------------------------
    ---------------------------------------------

--------------------------------------------------
展开代码

上面的示例中,我们使用了 CoordinatorLayout、AppBarLayout、Toolbar、NestedScrollView 和 TextView 这这些控件来对一个简单列表进行排版。其中,Toolbar 通过设置 app:layout_scrollFlags="scroll|enterAlways"来实现随着滚动的出现和隐藏,而 NestedScrollView 则通过设置 app:layout_behavior="@string/appbar_scrolling_view_behavior"来告诉 CoordinatorLayout 这个控件也需要与 Toolbar 协同工作。最后,TextView 用来填充一些其他的内容。

CoordinatorLayout 的一些高级技巧

Behaviors

在 CoordinatorLayout 上,每个控件都可以使用 Behavior 属性。Behavior 的意思是控件和其他控件之间的协同行为,也就是定义控件在和其他控件(或容器)组合使用时所需要的特定行为。Behavior 可以让你更加精细地调整组件之间的关联。如果你想自定义一些控件的 Layout Behavior,你可以通过实现 CoordinatorLayout.Behavior 接口并创建自定义的 Behavior 类来实现。

以下代码是自定义 Behavior 的示例:

-- -------------------- ---- -------
------ ----- -------------- ------- -------------------------------- -

    ------ ---------------- -
        --------
    -

    ------ ---------------------- -------- ------------ ---- -
        -------------- -----
    -

    ---------
    ------ ------- --------------------------------- ------- ---- ------ ---- ----------- -
        ------ ---------- ---------- -------------
    -

    ---------
    ------ ------- ---------------------------------------- ------- ---- ------ ---- ----------- -
        --- ------------ - -----------------------
        --- --------- - ----- ------------------ - ------------ - -------------------

        ---------------------------------

        ------ -----
    -
-
展开代码

在上述代码中,我们重写了 layoutDependsOn 方法和 onDependentViewChanged 方法。layoutDependsOn 方法用于询问 Behavior 是否需要依赖者,这里我们让它依赖 AppBarLayout,因为我们希望它能够接收一些动画效果。在 onDependentViewChanged 方法中,我们根据依赖视图的变化来移动我们的自定义视图。

Snap ScrollView

Snap ScrollView 是一个在 CoordinatorLayout 中使用的滚动视图,它可以让你更加精确地控制视图的垂直位置(通常是页眉、页脚、广告栏 等),而不需要自己编写一些复杂的代码。启用 Snap ScrollView,只需在 NestedScrollView 中添加 app:layout_behavior="@string/appbar_scrolling_view_behavior" 及 app:layout_scrollFlags="scroll|enterAlways|snap",然后通过在布局文件的 xml 内添加 app:behavior_collapseTopHeader="@id/appBarLayout" ,和在代码中添加监听事件达到目的即可。

下面是自定义 Snap ScrollView 的示例:

-- -------------------- ---- -------
------ ----- ------------------------- ------- ------------------- -

    ---------
    ------ ---- ----------------------------------- ------------- ------------------ ------ ----- --- --------- -

        --------------------------- -------------- - --- ----------------------------------------------- -

            ---------
            ------ ------ ---------------------------------- --------------- -
                ------ ------------------------------------------------------------------------------
            -

            ---------
            --------- --- --------------------------- -
                ------ --------------
            -
        --

        -------------------------------------------
        ----------------------------------
    -
-
展开代码

常见问题

为何 CoordinatorLayout 控件需要在 Android Support Design 库中?

CoordinatorLayout 控件是以及带有 design 前缀的各种控件组成的设计支持库的一部分,而这个库是为 Android 5.0 或更高版本提供的。如果你在低于 Android 5.0 的设备上使用 CoordinatorLayout 控件,那么系统会加载 Support Library 或 AppCompat 库,以便实现兼容性。

如何禁用掉 CoordinatorLayout 的自动协同行为?

CoordinatorLayout 中可以通过移除控件的 app:layout_behavior 属性来禁用控件的自动协同行为。如果需要重新启用,只需设置一个新的 Behavior 对象即可。以下是代码示例:

-- -------------------- ---- -------
------ ----- ------------- ------- ----------- -

    ------ --------------------- -------- ------------ ------ -
        -------------- -------
    -

    ------ --------------------- -------- -
        ---------------
    -

    ------ ---- -------------------------- ---------- -
        -- ----------- -
            ------------------------------ ------------ - -------------------------------- ------------------
            ---------------------------- --------------------------------------
        - ---- -
            ------------------------------ ------------ - -------------------------------- ------------------
            -------------------------------
        -
    -
-
展开代码

到这里,我们就学习了 CoordinatorLayout 的使用方法,希望对于 Material Design 界面的开发有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67c3da56314edc2684e057c1

纠错
反馈

纠错反馈