一手遮天 Android - view(导航类): DrawerLayout 基础

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 Android - view(导航类): DrawerLayout 基础

示例如下:

/view/navigation/DrawerLayoutDemo1.java

/**
 * DrawerLayout - 抽屉布局(侧滑菜单)
 *
 * 本例演示
 * 1、如何通过手势侧滑显示侧边菜单,然后再点击空白处可隐藏侧边菜单
 * 2、如何禁止侧边菜单响应手势操作,而只能通过程序来控制侧边菜单的显示和隐藏
 * 3、如何修改当显示侧边菜单时,覆盖在主界面上的遮罩层的颜色
 * 4、如何自定义侧边菜单显示和隐藏的动画效果
 */

package com.webabcd.androiddemo.view.navigation;

import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;

import com.webabcd.androiddemo.R;

public class DrawerLayoutDemo1 extends AppCompatActivity {

    private final String LOG_TAG = "DrawerLayoutDemo1";

    private DrawerLayout mDrawerLayout;
    private Button mButtonOpenRightDrawer;
    private Button mButtonCloseRightDrawer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_navigation_drawerlayoutdemo1);

        mDrawerLayout = findViewById(R.id.drawerLayout);
        mButtonOpenRightDrawer = findViewById(R.id.buttonOpenRightDrawer);
        mButtonCloseRightDrawer = findViewById(R.id.buttonCloseRightDrawer);

        sample();
    }

    private void sample() {

        // 修改当显示侧边菜单时,覆盖在主界面上的遮罩层的颜色
        mDrawerLayout.setScrimColor(0x88ff0000);

        // 侧滑菜单在显示和隐藏的过程中的事件监听
        mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
            // 侧边菜单显示的完整性发生变化时
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                // slideOffset - 侧边菜单显示的完整性(0 - 1 之间)
                Log.d(LOG_TAG, String.format("%s onDrawerSlide %f", drawerView.getTag(), slideOffset));

                // 通过 slideOffset 这个值可以自定义侧边菜单显示和隐藏的动画效果,比如可以像下面这样为侧边菜单添加透明度动画效果
                // drawerView.setAlpha(slideOffset);
            }

            // 侧边菜单完全打开时
            @Override
            public void onDrawerOpened(View drawerView) {
                Log.d(LOG_TAG, String.format("%s onDrawerOpened", drawerView.getTag()));
            }

            // 侧边菜单完全关闭时
            @Override
            public void onDrawerClosed(View drawerView) {
                Log.d(LOG_TAG, String.format("%s onDrawerClosed", drawerView.getTag()));
            }

            @Override
            public void onDrawerStateChanged(int newState) {
                // 0 - 手指不在侧滑菜单上且侧边菜单处于稳定状态(DrawerLayout.STATE_IDLE)
                // 1 - 手指正在侧滑菜单上拖动时(DrawerLayout.STATE_DRAGGING)
                Log.d(LOG_TAG, String.format("onDrawerStateChanged %d", newState));
            }
        });

        /**
         * setDrawerLockMode() - 指定侧边菜单的锁定状态
         *     DrawerLayout.LOCK_MODE_UNLOCKED - 不锁定,可以通过手势打开或关闭
         *     DrawerLayout.LOCK_MODE_LOCKED_CLOSED - 锁定为关闭状态,不可以通过手势打开(可以通过程序打开),但是可以通过手势关闭
         *     DrawerLayout.LOCK_MODE_LOCKED_OPEN - 锁定为打开状态,不可以通过手势关闭(可以通过程序关闭),但是可以通过手势打开
         * openDrawer(int gravity, boolean animate), closeDrawer(int gravity, boolean animate) - 通过程序打开或关闭指定的侧边菜单
         *     gravity - Gravity.START 代表左侧侧边菜单;Gravity.END 代表右侧侧边菜单
         *     animate - 是否显示动画效果
         */

        // 不允许手势打开右边侧滑菜单
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.END);
        mButtonOpenRightDrawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 打开右边侧滑菜单
                mDrawerLayout.openDrawer(Gravity.END, true);
                // 不允许手势关闭右边侧滑菜单
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, Gravity.END);
            }
        });
        mButtonCloseRightDrawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 关闭右边侧滑菜单
                mDrawerLayout.closeDrawer(Gravity.END, true);
                // 不允许手势打开右边侧滑菜单
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.END);
            }
        });
    }
}

/layout/activity_view_navigation_drawerlayoutdemo1.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
    DrawerLayout - 抽屉布局(侧滑菜单)

    指定了 layout_gravity="start" 的组件为左侧侧滑菜单
    指定了 android:layout_gravity="end" 的组件为右侧侧滑菜单
-->
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/buttonOpenRightDrawer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:text="打开右侧 drawer" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="TextView"
            android:textAlignment="center"
            android:textSize="64dp" />
    </FrameLayout>


    <!--
         指定了 layout_gravity="start" 的组件为左侧侧滑菜单
         layout_width - 此侧滑菜单的宽度
    -->
    <LinearLayout
        android:layout_width="180dp"
        android:layout_height="match_parent"
        android:background="@color/orange"
        android:layout_gravity="start"
        android:tag="left drawer">

    </LinearLayout>


    <!--
         指定了 android:layout_gravity="end" 的组件为右侧侧滑菜单
         layout_width - 此侧滑菜单的宽度
    -->
    <LinearLayout
        android:layout_width="180dp"
        android:layout_height="match_parent"
        android:background="@color/orange"
        android:layout_gravity="end"
        android:tag="right drawer">
        <Button
            android:id="@+id/buttonCloseRightDrawer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:text="关闭右侧 drawer"
            android:textAlignment="center" />
    </LinearLayout>

</androidx.drawerlayout.widget.DrawerLayout>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

posted @ 2021-05-31 12:48  webabcd  阅读(80)  评论(0编辑  收藏  举报