使用DrawerLayout实现简单的侧滑效果

简介

DrawerLayout是官方的一个实现侧滑菜单的控件,可以使用它实现大部分的侧滑效果。

基本步骤

首先在布局中使用DrawerLayout,它继承自VIewGroup,第一个childView就是我们的内容布局,第二个就是我们的菜单,当然也可以有第三个作为第二个菜单

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@mipmap/ic_launcher" />

        <ListView
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:tag="left"
            android:background="#fff"/>

        <ListView
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:layout_gravity="right"
            android:tag="right"
            android:background="#fff"/>

    </android.support.v4.widget.DrawerLayout>

contentView自然是要填充父布局,菜单的width自己设定就好,值得一提的是菜单的android:layout_gravity属性,left表示左菜单,right表示右菜单这很直观,还有一个start属性,官方解释如下

To support right-to-left (RTL) languages, specify the value with”start” instead of “left” (so the drawer appears on the right when the layout is RTL).

这样就实现最基本的使用了,效果如下
这里写图片描述

listview没有添加数据,背景图片也图省事直接用ic_laucnher,所以看起来比较丑。。。

设置监听

官方提供了接口DrawerListener,监听drawer的状态,需要重写以下四个个方法

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {

            }

            @Override
            public void onDrawerOpened(View drawerView) {

            }

            @Override
            public void onDrawerClosed(View drawerView) {

            }

            @Override
            public void onDrawerStateChanged(int newState) {

            }

方法名已经很明显了,在这就不解释了,接下来我们利用这个接口实现一个侧滑特效
代码如下

            mDrawer.addDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                // 判断是否左菜单
                if (drawerView.getTag().equals("left")) {
                    // 得到contentView
                    View content = mDrawer.getChildAt(0);
                    int offset = (int) (drawerView.getWidth() * slideOffset);
                    content.setTranslationX(offset);
                }

            }

            @Override
            public void onDrawerOpened(View drawerView) {

            }

            @Override
            public void onDrawerClosed(View drawerView) {

            }

            @Override
            public void onDrawerStateChanged(int newState) {

            }
        });

这里通过布局文件声明的tag属性来判断是哪一个菜单,如果是左菜单,我们就在滑动过程中不断设置content的translationX,这个值是根据菜单的宽度和偏移比例相乘得到的,效果如下
这里写图片描述
稍加修改就可以实现qq的侧滑效果

        mDrawer.addDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                // 判断是否左菜单
                if (drawerView.getTag().equals("left")) {
                    // 得到contentView
                    View content = mDrawer.getChildAt(0);
                    int offset = (int) (drawerView.getWidth() * slideOffset);
                    content.setTranslationX(offset);
                    content.setScaleX(1 - slideOffset * 0.5f);
                    content.setScaleY(1 - slideOffset * 0.5f);
                }

            }

            @Override
            public void onDrawerOpened(View drawerView) {

            }

            @Override
            public void onDrawerClosed(View drawerView) {

            }

            @Override
            public void onDrawerStateChanged(int newState) {

            }
        });

    }

这里写图片描述

使用ActionBarDrawerToggle

ActionBarDrawerToggle这个类实现了DrawerListener接口,它的作用就是配合ToolBar使用,这样我们点击ToolBar的home键时,就可以出发drawer。当然,虽然ActionBarDrawerToggle帮我们重写了四个方法,我们不需要重写,我们也可以根据自己需要重写相关方法,代码如下

        mToolbar.setTitle("Test");
        setSupportActionBar(mToolbar);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        mToggle = new ActionBarDrawerToggle(this, mDrawer, mToolbar, R.string.drawer_open, R.string.drawer_close) {

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                super.onDrawerSlide(drawerView, slideOffset);
                View content = mDrawer.getChildAt(0);
                if (drawerView.getTag().equals("left")) {
                    int offset = (int) (drawerView.getWidth() * slideOffset);
                    content.setTranslationX(offset);
                    content.setScaleX(1-slideOffset / 2);
                    content.setScaleY(1-slideOffset / 2);
                }
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                //mToolbar.setTitle("closed");
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                //mToolbar.setTitle("opened");
            }
        };
        mToggle.syncState();
        mDrawer.addDrawerListener(mToggle);

ActionBarDrawerToggle的构造函数第一个是Activity,第二个是DrawerLayout,第三个是ToolBar,接下来两个int我也不知道是什么。mToggle.syncState()方法是同步toolbar与drawerlayout的状态,也就是home的图标会改变,最后当然就是添加监听了,效果如下
这里写图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DrawerLayoutAndroid 中的一个布局容器,可以实现侧滑菜单的效果。用户可以通过滑动屏幕边缘或者点击按钮来打开或关闭侧滑菜单。侧滑菜单通常用于显示应用程序的导航菜单、设置选项、帮助信息等。DrawerLayout 可以与其他布局容器一起使用,例如 LinearLayout、RelativeLayout 等。 ### 回答2: DrawerLayoutAndroid 的一种界面布局控件,主要用于实现侧滑菜单的功能。侧滑菜单是一种常见的手机应用界面设计,它能在应用主界面之外提供额外的功能选项和导航选项,提高了用户体验。 DrawerLayout使用非常简单,需要将主界面和菜单分别定义成两个布局文件,然后将它们作为子控件添加到 DrawerLayout 中即可。DrawerLayout 提供了一些常用的属性和方法,可以自定义菜单的宽度、位置、滑动手势等等。一个简单的示例代码如下: ```xml <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 主界面内容 --> <FrameLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 菜单内容 --> <ListView android:id="@+id/menu_list" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" /> </android.support.v4.widget.DrawerLayout> ``` 上述代码中,DrawerLayout 是父布局,包含了主界面内容和菜单内容两个子布局,其中主界面内容使用了 FrameLayout,菜单内容使用了 ListView。菜单内容的宽度设置为 240dp,位置设置为左侧,即滑动手势从左侧边缘开始。 除了布局之外,DrawerLayout 还提供了一些监听器和回调方法,用于处理打开、关闭、滑动等操作。具体可以参考 Android 开发文档。 总之,DrawerLayout实现 Android 应用侧滑菜单的一种非常方便的控件,可以提高应用的功能性和用户体验。但需要注意的是,过度使用侧滑菜单会降低应用的可用性和易用性,开发人员应该在实际需要时使用。 ### 回答3: DrawerLayoutAndroid支持库中提供的一个布局控件,用于实现侧滑菜单的效果。通过DrawerLayout,我们可以在应用中添加一个侧滑菜单,用户可以通过手指滑动屏幕方式展开或收起该菜单。出现侧滑菜单的情况通常是当我们希望在一个屏幕中同时包含大量信息时,将导航或其他常用操作从主屏幕中分离出来的时候。 DrawerLayout使用非常简单。我们只需要将我们的主要内容和侧滑菜单分别放置在DrawerLayout中即可。然后将菜单居右侧或左侧设计样式,菜单的宽度可以指定。继而,我们可以通过布局或代码控制菜单的展开或收缩给用户提供更好的用户体验。因为默认情况下,用户可以通过滑动手势来展开或隐藏菜单。 在实现DrawerLayout侧滑菜单时,我们可以通过多种方式添加项目菜单,比如说ListView, GridView或Menu。但是,建议使用RecyclerView支持性更好而且可以和其他布局组合使用。如果需要更高级的菜单创建选项(Settings),我们可以使用PreferenceFragment,这样会尽可能地向用户提供标准化的菜单设置。 总之,DrawerLayout是一个非常方便的布局控件,不仅仅可以实现移动设备上的侧滑菜单,也可以在其他应用中方便地使用。它的灵活性让我们可以更加轻松地为用户提供更好的移动应用体验,并且很容易实现这一点。如果您是一名Android应用程序员,DrawerLayout值得一试!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值