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在里面判断

看下效果:

最新文章

  1. ASP.NET MVC Model绑定(五)
  2. 哈哈:sqlserver2008附加数据库时操作系统错误5(拒绝访问)错误5012的解决办法
  3. HDU 3078 (LCA+树链第K大)
  4. PHP面向对象的一些深入理解
  5. 【WinForm】C# 采用POST登录京东
  6. 数据库建表的时候报 “1215 Cannot add foreign key constraint”
  7. SpringMvc项目中使用GoogleKaptcha 生成验证码
  8. 自动化测试基础篇--Selenium弹出框alert
  9. 【ZJOI2016】线段树
  10. SQL语句(三)数据表的修改
  11. 一篇linux的通讯文章
  12. 【转】Smartphone--Android真机管理平台
  13. 使用JSP的fmt标签实现国际化支持
  14. 万恶之源 - Python函数进阶
  15. 部分替换mysql表中某列的字段
  16. pytorch 如何使用tensorboard实时查看曲线---- tensorboardX简介
  17. Codeforces Round #277.5 (Div. 2)部分题解
  18. [Tools]SurveyMonkey
  19. 动态代理方案性能对比 (CGLIB,ASSIT,JDK)
  20. 1.6(SQL学习笔记)存储过程

热门文章

  1. PHP中使用CURL之php curl详细解析和常见大坑
  2. AR资料汇总学习
  3. Windows7下采用cygwin编译安装swoole扩展
  4. P1613 跑路
  5. 洛谷 P1272 重建道路
  6. 如何写javascript代码隐藏和显示这个div
  7. D. Minimum Diameter Tree Round #528 (Div. 2)【树】
  8. HDU - 4686 函数积的前缀和
  9. 在python3.5中pip安装scrapy,遇到 error: Microsoft Visual C++ 14.0 is required
  10. 剑指offer——面试题11:快速排序