android design库DrawerLayout的使用及实现类似网易云音乐菜单效果

本文介绍如何利用Android Design库中的DrawerLayout来创建类似网易云音乐的侧滑菜单效果。通过布局和Activity代码的设置,结合StatusBarColor的调整,实现沉浸式体验。在Activity中使用ActionBarDrawerToggle绑定DrawerLayout和ActionBar,通过监听器处理菜单事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用网易云音乐的时候感觉它的侧滑菜单效果还是很酷炫的,而且在看过Design库以后就很清楚它应该是用DrawerLayout实现的(讲道理应该是哈)。
网易云音乐效果图:
网易云音乐效果图
Demo效果图
建一个Activity,在布局中键入如下代码,注释也写了的:

<?xml version="1.0" encoding="utf-8"?>
<!--根布局为DrawLayout,视个人情况而定
    为了方便实现沉浸式效果,还是建议以此为根
    而且DrawerLayout的高度一定要是MeasureSpec.EXACTLY
    详情可查看DrawerLayout的onMeasure方法-->
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="start">
    <!--内容层,DrawerLayout会根据child的layout_gravity属性来判断谁是content谁是drawer
    可查看DrawerLayout的isContentView方法和isDrawerView方法
    另外值得一提的是,两个childView的位置如果调换,虽说任然会有菜单,但是相同代码情况下状态栏只是半透明而不是全透明
    如果有大神看到,望解我疑惑-->

    <!--下面有个background属性,这一步很关键-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:background="@color/colorPrimaryDark"
        android:orientation="vertical">
        <!--就是个toolbar
        对于这种项目中可能经常用到的东西,建议把他封装起来-->
        <include layout="@layout/layout_toolbar"/>
        <!--正儿八经的内容-->
        <include layout="@layout/content_activity_main" />

    </LinearLayout>
    <!--菜单
    布局随意选择
    NavigationView是google专为DrawerLayout量身打造的菜单控件,已menu的形式设置布局,用起来确实方便
    而且NavigationView提供一个headerLayout和menu属性来让你个性化你的应用-->
    <android.support.design.widget.NavigationView
        android:id="@+id/navigationView"
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/layout_nav_header"
        app:menu="@menu/menu_nav_main">
    </android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

接下来就是Activity的代码了,像平常实现类似沉浸式效果一样(这个值得一个优秀的Android应用从建项目开始)需要为window设置flag:

void initWindow(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
          //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }

而本次就不一样了,还需要为window设置statusBarColor,


    void initWindow2(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP )
        {
            Window window = getWindow();//获取window
            window.setStatusBarColor(Color.TRANSPARENT);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        }
    }

由于我只有两部4.2和5.1的手机,本次测试也是在5.1上测试的,至于5.1之前到底是啥效果,我也不知道。。。
先来看看onCreate方法:

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWindow2();

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle(getString(R.string.description));

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,mDrawerLayout,
                toolbar,R.string.openDrawer,R.string.closeDrawer);
        mDrawerLayout.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView);
        navigationView.setNavigationItemSelectedListener(this);

    }

其中大部分我想都看得懂吧,来说一说这个ActionBarDrawerToggle,看看官方文档
* This class provides a handy way to tie together the functionality of
* {@link android.support.v4.widget.DrawerLayout} and the framework ActionBar to
* implement the recommended design for navigation drawers.
直白点说就是它使DrawerLayout和ActionBar绑定到一起,内部已经实现了对DrawerLayout的控制,
toggle.syncState()方法就是同步DrawerLayout当前状态。
对于NavigationView的操作就不多说了,设置监听器,并在监听器里面处理事件就ok啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值