Material Design 中使用 CollapsingToolbarLayout 实现头部效果详解

阅读时长 22 分钟读完

介绍

Material Design 是 Google 推出的新一代设计语言,它提供了一套标准的 UI 设计风格,可以帮助开发者快速的开发出漂亮的应用。其中,CollapsingToolbarLayout 是 Material Design 中非常重要的一个组件,它可以让头部随着页面的滚动而发生变化,从而提供了更加生动和醒目的效果。

CollapsingToolbarLayout 在设计上采用了折叠式布局的思路,可以将页眉部分收缩至指定高度,同时伴随一个逐渐透明的过渡区域,使得页面滑动效果更加美观和自然。

实现过程

Step1:添加依赖

首先,我们需要在项目中添加 CollapsingToolbarLayout 的库文件。在 gradle 中添加以下依赖即可:

Step2:布局文件

接下来,在布局文件中,我们需要对页面进行分层布局,最下层放置一个 RecyclerView,用来显示列表中的内容,在最上方放置一个 CollapsingToolbarLayout,用于展示头部内容,并且随着页面的滑动,实现折叠和展开的效果。

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

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

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

我们可以发现,在 CollapsingToolbarLayout 中设置了两个比较重要的属性:

  • contentScrim:表示当 CollapsingToolbarLayout 处于折叠状态时,显示的颜色
  • layout_scrollFlags:表示该组件的滚动类型,在这里,我们设置了 scroll 和 exitUntilCollapsed,表示可以随着页面的滑动而滚动,并在达到最小高度后不再滚动,即代码中对应的 app:layout_scrollFlags="scroll|exitUntilCollapsed"。如果只需要实现滑动效果,可以设置为 app:layout_scrollFlags="scroll"

Step3:添加 Toolbar 控件

在 CollapsingToolbarLayout 中,一般需要添加一个 Toolbar 控件,用于显示标题、菜单等内容。添加 Toolbar 的方法很简单,只需要在 CollapsingToolbarLayout 中放置一个 Toolbar 控件即可。

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

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

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

Toolbar 控件和 CollapsingToolbarLayout 有一个关键的属性:app:layout_collapseMode,它用来设置 Toolbar 的折叠模式,可以设置为 pin 或 parallax。pin 表示 Toolbar 会在折叠到一定高度之后停止折叠,并固定在屏幕顶部,而 parallax 则会在折叠的同时添加一些视差滑动效果。我们在这里将其设置为 pin。

Step4:添加背景图片

随后,在 CollapsingToolbarLayout 中添加一张背景图片,用于展示应用的主题。我们在这里使用一个 ImageView 来承载图片。

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

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

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

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

在这里,我们设置 ImageView 的折叠模式为 parallax,表示它会随着页面滑动而发生视差滚动的效果。

Step5:添加标题和子标题

在 CollapsingToolbarLayout 中,我们还可以添加一些额外的文字信息,比如标题和子标题等。这些信息显示的位置和样式取决于具体的布局方式。我们在这里使用了简单的 FrameLayout 布局方式。

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

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

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

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

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

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

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

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

在这里,我们使用了 FrameLayout 来承载标题和子标题,同时也设置了相应的折叠模式和折叠视差参数。

Step6:代码实现

最后,我们需要在 Java 代码中实现具体的功能逻辑。这里我们主要用到了 AppBarLayout 和 OnOffsetChangedListener 两个类。

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

在 onOffsetChanged 方法中,我们监听了 AppBarLayout 的滑动变化,根据滑动的相对位置和总高度来调整标题和菜单的显示状态。

示例代码

下面是一个完整的应用示例代码。

activity_main.xml

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

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

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

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

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

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

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

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

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

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

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

MainActivity.java

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

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

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

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

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

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

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

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

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

RecyclerAdapter.java

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

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

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

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

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

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

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

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

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

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

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

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

item_recycler.xml

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

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

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

结论

CollapsingToolbarLayout 是 Material Design 中非常重要的一个组件,它提供了折叠式布局的思路,可以让头部随着页面的滚动而发生变化,从而提供了更加生动和醒目的效果。在实现过程中,我们需要对页面进行分层布局,使用 Toolbar 和 ImageView 等控件来实现具体的效果。

在代码实现中,我们主要用到了 AppBarLayout 和 OnOffsetChangedListener 两个类。AppBarLayout 表示一个可以响应滚动事件的容器,OnOffsetChangedListener 表示一个监听滚动事件的监听器。通过监听 AppBarLayout 的滚动变化,我们可以通过设置页面元素的透明度等属性,实现具有各种效果的滑动效果。

当然,还有很多细节需要自己去调整和完善。我们需要根据具体的需求来对折叠式布局进行各种变化和调整,通过对各个属性的设置和生动的界面动画,让我们的应用更加生动和吸引人。

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

纠错
反馈