前面我们说了自定义侧滑菜单,也说了SlidingMenu的使用,这一节我们再来说下DrawerLayout。DrawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说DrawerLayout是因为第三方控件如SlidingMenu等出现之后,google借鉴而出现的产物。DrawerLayout分为侧边菜单和主内容区两部分,侧边菜单可以根据手势展开与隐藏(drawerLayout自身特性),主内容区的内容可以随着菜单的点击而变化(这需要使用者自己实现)。drawerLayout其实是一个布局控件,跟LinearLayout等控件是一种东西,但是drawerLayout带有滑动的功能。只要按照drawerLayout的规定布局方式写完布局,就能有侧滑的效果。

1、DrawerLayout的使用

使用时直接将DrawerLayout作为根布局,然后其内部第一个View为内容区域,第二个View为左侧菜单,第三个View为右侧侧滑菜单,当然第三个是可选的。主内容区的布局代码要放在侧滑菜单布局的前面,这样可以帮助DrawerLayout判断谁是侧滑菜单,谁是主内容区;
第一个View也即主界面的宽高应当设置为match_parent。
第二、三个View需要设置android:layout_gravity="left",和android:layout_gravity="right"且一般高度设置为match_parent,宽度为固定值,即侧滑菜单的宽度。
按照上面的描述写个布局文件,然后设置给Activity就添加好了左右侧滑
写一个布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/drawer_main_layout"
    tools:context="com.example.drawerlayout.MainActivity">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:id="@+id/btn_main_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="OpenRightMenu"
            android:text="打开"
            android:layout_alignParentTop="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

    </RelativeLayout>

    <fragment
        android:id="@+id/id_left_menu"
        android:name="com.example.drawerlayout.fragment.LeftFragment"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:tag="Left" />

    <fragment
        android:id="@+id/id_right_menu"
        android:name="com.example.drawerlayout.fragment.RightFragment"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:tag="RIGHT" />
</android.support.v4.widget.DrawerLayout>

看布局文件我们可以知道,左菜单和右菜单我们都是用一个fragment进行实现,具体的代码就不再写了,大家可以下载源码查看

2、看下MainActivity.java

public class MainActivity extends AppCompatActivity {private DrawerLayout mDrawerLayout;
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        setListeners();
    }private void initViews() {mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_main_layout);
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
                Gravity.RIGHT);
        mButton = (Button) findViewById(R.id.btn_main_right);
    }private void setListeners() {mButton.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {mDrawerLayout.openDrawer(Gravity.RIGHT);
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,
                        Gravity.RIGHT);
            }});
        mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {//在这个方法里可以设置动画效果
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {}// 菜单打开
            @Override
            public void onDrawerOpened(View drawerView) {}// 菜单关闭
            @Override
            public void onDrawerClosed(View drawerView) {mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);
            }@Override
            public void onDrawerStateChanged(int newState) {}});
    }}
drawerLayout菜单的展开与隐藏可以被DrawerLayout.DrawerListener的实现监听到,这样你就可以在菜单展开与隐藏发生的时候做一些希望做的事情,比如更新actionbar菜单等。如果你的activity有actionbar的话,建议用ActionBarDrawerToggle来监听,这是因为ActionBarDrawerToggle实现了DrawerListener,所以他能做DrawerListener可以做的任何事情,同时他还能将drawerLayout的展开和隐藏与actionbar的app 图标关联起来,当展开与隐藏的时候图标有一定的平移效果,点击图标的时候还能展开或者隐藏菜单。
在本例中右侧菜单需要点击才能出现,所以在初始化DrawerLayout的时候,使用了 mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,Gravity.RIGHT); 意思是关闭手势滑动。然后在弹出以后,需要让手势可以滑动回去,所以在openRightMenu方法中又调用
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,Gravity.RIGHT); UNLOCK了一下。最后在onDrawerClosed回调中,继续设置mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,Gravity.RIGHT);
3、setDrawerListener
通过代码也能看出来,可以使用setDrawerListener监听菜单的打开与关闭等等。这里对于当前操作是哪个菜单的判断是通过TAG判断的,使用gravity应该也能判断出来,大家可以试试
由于DrawerLayout默认只能从边界划出菜单,但是一般侧滑菜单的手势区域都比较大,有兴趣的话,可以重写Activity的onTouchEvent在里面判断

看下效果:

源代码

参考:

http://blog.csdn.net/lmj623565791/article/details/41531475
http://blog.csdn.net/xiaanming/article/details/18311877
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0925/1713.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0303/2522.html
http://wenku.baidu.com/link?url=WyWUhUROnI4F3Ne8PaHTNgmsG1APDWK4WJ1wfoHpOhNyi4rtLqCWslQQSYVF740WFO11pVuVOEBEOi1GvpOCoq9EAynbtLSO2NHAVS6kqjG
http://www.linuxidc.com/Linux/2014-08/105502.htm

DrawerLayout侧滑详解相关推荐

  1. Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...

  2. DrawerLayout的导航图标详解

    前言 DrawerLayout是Google官方推出的一个应用于侧滑菜单的工具类,遵循Google提出的Material Design设计风格.而DrawerLayout与Toolbar之间的图标联动 ...

  3. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  4. Android百度地图实例详解之仿摩拜单车APP(包括附近车辆、规划路径、行驶距离、行驶轨迹记录,导航等)

    Android百度地图实例详解之仿摩拜单车APP(包括附近车辆.规划路径.行驶距离.行驶轨迹记录,导航等) 标签: android百度地图行驶轨迹记录共享单车行驶距离和时间 2017-03-08 20 ...

  5. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例

    使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现 2.纯代码实 ...

  6. 详解Xcode 6的视图调试

    详解Xcode 6的视图调试 2015-04-23 10:58 编辑: suiling 分类:iOS开发 来源:CocoaChina翻译 0 14885 XCodeXcode 6视图调试 招聘信息: ...

  7. php中 act什么意思,剑网三act是什么意思?详解丐帮act概念

    巴士招募<剑网3>写手,视频解说,游戏高手,漫画达人等等一系列的玩家!无门槛没有要求!如果你也喜欢写作,想把你的心情和游戏故事分享给大家,欢迎前来投稿!一经采用即有众多丰厚奖励作为感谢!如 ...

  8. 汽车知识入门篇之汽车参数详解

    许多消费者在购车之前都会先关注车型的口碑,这是很实用的方法.不过读懂参数可能更方便找到满足自身需求的车型. 一.汽车的主要结构参数和性能参数 汽车的主要特征和技术特性随所装用的发动机类型和特性的不同, ...

  9. Android 官方架构组件 Navigation 使用详解

    前言 前段时间,我在做项目开发的时候对Fragment的管理遇到几个小问题,总觉得在现阶段封装好的Fragment管理器不太优雅.这成为我下决心学习Jetpack在很早之前推出的Navigation库 ...

最新文章

  1. android录制视频横向,Android从零开始(26)(设置全屏+横屏、相机拍照、视频录制)(新)...
  2. 遗传算法求解背包问题
  3. 【LeetCode】剑指 Offer 16. 数值的整数次方
  4. 送你一份后端必备的 Git 分支开发规范指南
  5. easyui table 如何只展示一条_如何使用MySQL,这些操作你得明白!
  6. C++线程中packaged_tack
  7. html三级链表,二叉链表怎么画
  8. java基本数据类型转类对象
  9. 【滤波器】7. 带通滤波器
  10. 单独开一贴个人认为是编译器缺陷希望有人提交给微软
  11. html仿苹果桌面导航js css,JS+CSS仿苹果手机(Iphone)的滑动效果的焦点图
  12. 单片机的俄罗斯方块游戏设计
  13. TTL 传输中过期,内部网络环路
  14. vue-qq 实践(一)
  15. 卸载32位office安装64位office卸载不完全导致不能安装64位office时解决办法
  16. matlab p文件转码 matlab pcode文件 将matlab中的p文件转为m文件工具
  17. Hadoop分布式集群配置
  18. android 设置视频大小,android – 调整视频大小
  19. 古巴比伦理财五大金科定律
  20. l003 Driller Augmenting Fuzzing Through Selective Symbolic Execution_2016_NDSS学习笔记

热门文章

  1. ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)
  2. kafka之Producer同步与异步消息发送及事务幂等性案例应用实战
  3. SecureCRT通过密钥进行SSH登录
  4. swift的基础语法(二)
  5. 如何附加被分离的质疑数据库?
  6. 非程序员如何使用 Git——版本控制你的生活
  7. LeetCode——Contains Duplicate III
  8. make_ext4fs 失败
  9. C#+WebSocket+WebRTC多人语音视频系统
  10. Objective-C KVC