Material Design 自定义 DrawerLayout 详解

阅读时长 11 分钟读完

材料设计(Material Design)是谷歌推出的一种视觉设计语言,旨在为移动和 web 应用程序提供一致,统一和可预测的外观。其中 DrawerLayout 是 Material Design 中常用的一种布局方式,它允许我们在屏幕边缘展示导航菜单。本文将详细讲解如何自定义 DrawerLayout。

DrawerLayout 基本使用

DrawerLayout 具有两个子视图,第一个子视图是主内容视图,第二个子视图是抽屉视图,如下所示:

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

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

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

注意,抽屉布局的 android:layout_gravity="start" 属性表示这个布局将靠左侧对齐,也就是说它是展示在屏幕左侧边缘的。

默认情况下,抽屉布局可以通过手势从左侧边缘拉出(通过滑动主布局的边缘)或者通过点击导航按钮来打开。

DrawerLayout 自定义

如果希望自定义 DrawerLayout,例如想更改展开的手势或者实现自定义的扩展部分,那么就需要继承 DrawerLayout。

下面是一个自定义 DrawerLayout 的例子,这个例子中展示了如何自定义手势扩展:

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

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

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

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

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

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

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

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

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

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

在这个例子中,我们继承了 DrawerLayout 并且覆盖了 onInterceptTouchEvent 方法。在此方法中,我们使用 GestureDetectorCompat 检测手势,如果检测到用户向下滑动大于 500 的速度,就关闭抽屉;如果检测到用户向上滑动大于 500 的速度,就打开抽屉。

DrawerLayout 扩展部分

如果需要自定义 DrawerLayout 的扩展部分,需要通过在抽屉布局中添加一个 FrameLayout 来实现。这个 FrameLayout 中包含我们自己定义的布局。

下面是一个自定义 DrawerLayout 扩展部分的例子,该例子展示了如何添加一个 Android 应用商店风格的扩展部分:

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个例子中,我们添加了一个 LinearLayout 用于包含扩展部分,通过设置 layout_weight="1" 来使该布局填满剩余的抽屉空间。扩展布局采用了垂直的 LinearLayout 布局,内部包含一个 ActionBar 风格的布局和一个导航列表。

总结

在这篇文章中,我们通过介绍了 DrawerLayout 的基本用法,并通过一个自定义手势扩展的例子详细讲解了如何自定义 DrawerLayout。我们还展示了如何添加自定义的抽屉扩展部分,并以 Android 应用商店风格的扩展部分为例子展示了如何实现。

通过这些示例,我们可以看到 DrawerLayout 具有很强的灵活性和扩展性,可以适应各种需求。如果你正在开发 Android 应用,DrawerLayout 是一个很好的选择来实现侧滑菜单的布局效果。

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

纠错
反馈