美文网首页tipiOS分享的demoUI
高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问

高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问

作者: 下位子 | 来源:发表于2017-01-07 17:13 被阅读6324次

    自从2014那年谷歌提出的Material Design后,这种设计语言就广泛被程序猿使用,屡试不爽。在现如今的各个流行APP中,你都能发现它的身影。详细情况,自己百度吧,我只想说很装B。


    今天我就说一下其中的一个控件 DrawerLayout。在此之前,我一直用的是SlidingMenu,虽然体验也不错,但是也有一些bug...比如不能修改成沉浸式状态栏,后来有位大神跟我说如何修改,但对其印象就不是很好。当我接触到DrawerLayout,发现它用起来简单,方便,毕竟是谷歌亲儿子。

    DrawerLayout预览

    DrawerLayout主要功能就是 实现侧滑菜单效果的功能,并且可以通过增加一些设置来实现高大上的效果,那么就请看动态图:

    注意左上角那个图标,有木有很好玩,哈哈...

    接下来就介绍如何实现这一功能

    1. 在项目对应的build.gradle中添加依赖

        dependencies {
            ...//其他代码
            compile 'com.android.support:appcompat-v7:24.0.0'
            compile 'com.android.support:design:24.0.0'
               ...//其他代码
        }
    

    2. 添加ToolBar,创建toolbar.xml文件

        <?xml version="1.0" encoding="utf-8"?>
            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
        
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:clipToPadding="true"
                android:fitsSystemWindows="true"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:title="资讯"
                app:titleTextColor="#fff">
            </android.support.v7.widget.Toolbar>
        </RelativeLayout>
    

    3. 在main.xml中添加DrawerLayout

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <!-- 添加ToolBar -->
            <include layout="@layout/toolbar"/>
    
            <!--添加DrawerLayout-->
            <android.support.v4.widget.DrawerLayout
                android:id="@+id/drawerlayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <!-- 一般第一个位置的代表 主内容 -->
                <FrameLayout
                    android:id="@+id/main"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
                </FrameLayout>
    
                <!-- 左侧菜单(设置layout_gravity 为left) -->
                <RelativeLayout
                    android:id="@+id/left"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="left">
                </RelativeLayout>
    
                <!-- 右侧菜单(设置layout_gravity 为right) -->
                <RelativeLayout
                    android:id="@+id/right"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="right">
                </RelativeLayout>
                
            </android.support.v4.widget.DrawerLayout>
        </LinearLayout>
    

    DrawerLayout一般分为三个部分 主内容,左侧菜单,右侧菜单
    每个部分的内容自行设置,我是采用Fragment方式设置内容,这里仅供参考

        //新建Fragment,具体内容我就不详细说了
        fragmentMain = new FragmentMain();
        //添加内容,比较简单的
        getSupportFragmentManager().beginTransaction().replace(R.id.main, fragmentMain).commit();
    

    到此为止已经初步实现了侧滑菜单的功能,来看一下效果

    DrawerLayout初效果.gif

    然后,就是给侧滑按钮添加效果了

    1. 在此之前要进行view的初始化

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerlayout);
        toolbar = (Toolbar) this.findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    

    2. 通过ActionBarDrawerToggle来完成效果,操作很简单

        mToggle = new ActionBarDrawerToggle(HomeActivity.this, 
                                            mDrawerLayout, 
                                            toolbar, 
                                            R.string.open,
                                              R.string.close);
        mToggle.syncState();
        mDrawerLayout.addDrawerListener(mToggle);
    

    这样就结束了

    最后就是解决DrawerLayout不能全屏滑动的问题

    private void setDrawerLeftEdgeSize (Activity activity, DrawerLayout drawerLayout, float displayWidthPercentage) {
        if (activity == null || drawerLayout == null) return;
        try {
            // 找到 ViewDragHelper 并设置 Accessible 为true
            Field leftDraggerField =
                    drawerLayout.getClass().getDeclaredField("mLeftDragger");//Right
            leftDraggerField.setAccessible(true);
            ViewDragHelper leftDragger = (ViewDragHelper) leftDraggerField.get(drawerLayout);
    
            // 找到 edgeSizeField 并设置 Accessible 为true
            Field edgeSizeField = leftDragger.getClass().getDeclaredField("mEdgeSize");
            edgeSizeField.setAccessible(true);
            int edgeSize = edgeSizeField.getInt(leftDragger);
    
            // 设置新的边缘大小
            Point displaySize = new Point();
            activity.getWindowManager().getDefaultDisplay().getSize(displaySize);
            edgeSizeField.setInt(leftDragger, Math.max(edgeSize, (int) (displaySize.x *
                    displayWidthPercentage)));
        } catch (NoSuchFieldException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }
    }
    

    直接调用这个方法即可!最后一个参数 传 1,即可实现全屏滑动。如果你想让右侧菜单也是全屏,只要将对应的 "mLeftDragger" 改为 "mRightDragger"。

    我的博客地址
    再次感谢那些给我提供帮助的文章,博客和人!!我会努力的!!

    相关文章

      网友评论

      • 024f10401d39:我用openDrawer展开侧滑菜单获取不到值,因为我获取值的方法是写在侧滑栏的Activity里面。就是用openDrawer展开的话他不执行Activity里面的方法,只有跳转的时候才能拿到值,这样怎么解决呢
        下位子:你是要获取什么值呢
      • 069b9a9c70d1:同时设置 "mLeftDragger" 改为 "mRightDragger",前面设置的那个会失效,有什么办法?
        下位子:@JWangCrossover 失效是值不能滑动吗,还是不能根据设置边缘的距离,滑动
        069b9a9c70d1:@下位子 是的,先设置的那个会失效
        下位子:代码写两次,两个同时设置,也不行嘛
      • 3c3553526b7d:请问一下现在全屏滑动有没有改动?这样设置全屏滑动有个缺陷,在主显示界面长按,而又没有其它空间消化这个点击事件,侧面的菜单会直接覆盖全屏
        下位子:@飞吧小鹰 这个我还真不知道…我工作日的时候看一下…
      • 码锻:能请教下menu图标与文字的距离是怎么设置的
        下位子:@断头人 尴尬
        码锻:@下位子 NavigationDrawer中条目图标和文字的距离,不过我看错了,你这个不是结合这个弄的
        下位子:啥意思?
      • 1d65221a9608:反射还是不要优先考虑较好。
        下位子:对的没错,如果项目大的话,确实会影响性能。
      • 4fdeb2ad2542:您好 我想问一下 设置DrawerLayout 展开的方法是那个属性 (主要是想点击头像想让它展开)
        下位子:啥意思?openDrawer 你说的是这个方法 吗?
      • BigLong:感谢楼主,正准备重写 DrawerLayout 解决这个全屏滑动拉起侧滑,然后看到这个!!!感谢!!!displayWidthPercentage 可以设置80%左右,否则在最右侧20%区域拉起滑动,左侧抽屉菜单会有白屏。
        下位子: @BigLong 😘😘
      • JasonChoi:我想请教一下那如何让滑动过来的侧边栏最终也是占据全屏显示呢?
      • 你在烦恼些什么:能控制滑动速度吗?
        下位子:@你在烦恼些什么 什么意思?就是根据手势滑动的
      • ebcfe8107739:关注大神,学习经验。
        下位子: @很帅气的昵称呢 没有没有,互相学习!
      • Galaxy北爱:额。。我想说 全屏 明明2行代码就能搞定。。。居然还反射。。。
        下位子: @Galaxy北爱 懂了,多谢
        Galaxy北爱:@下位子 其实很简单的,得到屏幕的宽度,直接把这个宽度设置給滑动View的宽度就可以了。
        下位子: @Galaxy北爱 如何搞定?大神
      • 小默森:谢谢一如既往的点赞,小年快乐,赶快更新
        下位子: @万能森森 小年快乐,一起努力!我今天回家,就有时间慢慢更新
      • b6dc4f4fa3b9:可以 大神
        下位子: @b6dc4f4fa3b9 嘻嘻
      • 小默森:现在的年轻人真可怕,学习速度太快了,用词比我专业多了.
        这个gif图片怎么做的啊?
        还有就是,我博客经常要发视频,markdown能插入视频吗?
        小默森:@下位子 27
        下位子: @万能森森 不能插入视频,可以插入gif,差不多,我是window用的是LICEcap软件。就是可以录制屏幕,转换成gif格式
        下位子: @万能森森 兄弟,你才多大,就说年轻人…

      本文标题:高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问

      本文链接:https://www.haomeiwen.com/subject/mppfbttx.html