DrawerLayout是添加在v4包中的一个布局类
Google官方对于DrawerLayout的解释如下:
DrawerLayout acts as a top-level container for window content that allows for interactive "Navigation Drawer.drawer" views to be pulled out from one or both vertical edges of the window.
Drawer positioning and layout is controlled using the android:layout_gravity attribute on child views corresponding to which side of the view you want the drawer to emerge from: left or right (or start/end on platform versions that support layout direction.) Note that you can only have one drawer view for each vertical edge of the window. If your layout configures more than one drawer view per vertical edge of the window, an exception will be thrown at runtime.
To use a DrawerLayout, position your primary content view as the first child with width and height of match_parent and no layout_gravity>. Add drawers as child views after the main content view and set the layout_gravity appropriately. Drawers commonly use match_parent for height with a fixed width.
DrawerLayout.DrawerListener can be used to monitor the state and motion of drawer views. Avoid performing expensive operations such as layout during animation as it can cause stuttering; try to perform expensive operations during the STATE_IDLE state. DrawerLayout.SimpleDrawerListener offers default/no-op implementations of each callback method.
As per the Android Design guide, any drawers positioned to the left/start should always contain content for navigating around the application, whereas any drawers positioned to the right/end should always contain actions to take on the current content. This preserves the same navigation left, actions right structure present in the Action Bar and elsewhere.
将其简单的翻译
DrawerLayout作为一个窗口主体的最高等级的容器,它允许交互式的“Navigation Drawer.drawer”视图从窗口的垂直边缘拉出。
“抽屉”的位置和布局,由它的子视图的android:layout_gravity来决定,主要是取决于子视图的数据为left/right(start/end在支持直接布局的平台版本上).注意,在每一个窗口主体边缘,只可以有一个“抽屉”视图。如果你的布局配置了多个“抽屉”视图,那么在运行的过程中就会抛出异常。
使用DrawerLayout的时候,将你的主内容视图放到第一个位置,并且标注你的主内容视图的width和height为match_parent,并且确保没有layout_gravity属性。在设置完content视图后,以子视图的形式,添加“抽屉”视图,并且设置合适的layout_gravity.“抽屉”视图一般设置height为match_parent,以及一个固定数值的width。
DrawerLayout.DrawerListener被用作监听“抽屉”视图的状态和动作。应该避免在动画的过程中有费时操作,因为它会导致卡顿;尽量在STATE_IDLE状态下,做费时操作。DrawerLayout.SimpleDrawerListener为DrawerLayout.DrawerListener提供了默认/无操作接口。
根据Android设计指导,位于left/start的“抽屉”通常是为应用主体提供导航工作,而位于right/end的“抽屉”通常是为当前主体提供动作操作,这遵循了与Action Bar或者其他的,一样的 左侧导航,右侧动作 的设计。
从Google官方文档中,我们可以确定如下几个要点
1. DrawerLayout一般是作为第一个层级的容器使用,允许“窗口”从主体视图的垂直边缘拉出
2. “抽屉”布局,必须要要设定“android:layout_gravity”属性(Google建议这个属性尽量使用start/end,以保证能够适应RTL布局,取代此前的left/right)
3. DrawerLayout视图包含的主内容视图,必须要放到DrawerLayout的第一个视图(原因是xml视图是按照层叠顺序排序的)中,并且其width和height均需要设定为match_parent(原因是,当“抽屉”视图隐藏的情况下,主内容视图是唯一显示视图)
4. DrawerLayout有两个监听,DrawerListener为接口,SimpleDrawerListener为no-op实现了DrawerListener的抽象类
5. 在“抽屉”打开或者关闭的过程(打开动画或者关闭动画过程)中,尽量不要有费时操作,否则会导致卡顿。如果有费时操作,需要在STATE_IDLE状态下做
6. 一般来说,左侧的抽屉一般用作导航操作,右侧的抽屉一般用作动作。
DrawerLayout还提供了一些重要的方法
setDrawerListener(DrawerListener listener)
addDrawerListener(@NonNull DrawerListener listener)
removeDrawerListener(@NonNull DrawerListener listener)
------这三个方法主要用于设置或者去除“抽屉”的监听,其中:setDrawerListener方法在API 24.1.0开始已经废弃了,而addDrawerListener和removeDrawerListener可以实现设置多个“抽屉”监听
setDrawerLockMode(@LockMode int lockMode) 设置DrawerLayout的锁定模式
getDrawerLockMode(@EdgeGravity int edgeGravity) 获取DrawerLayout的某一个“抽屉”的锁定模式
getDrawerLockMode(View drawerView)获取DrawerLayout的某一个“抽屉”的锁定模式
------设定和获取抽屉的锁定模式,DrawerLayout提供了四种锁定模式,分别为:
1. LOCK_MODE_UNLOCKED 抽屉处于未锁定状态
2. LOCK_MODE_LOCKED_CLOSED 抽屉处于锁定关闭状态,用户无法手动打开抽屉,只能通过代码控制
3. LOCK_MODE_LOCKED_OPEN 抽屉处于锁定打开状态,用户无法手动关闭抽屉,只能通过代码控制
4. LOCK_MODE_UNDEFINED 抽屉的状态未定义(DEFAULT)
setDrawerTitle(@EdgeGravity int edgeGravity, CharSequence title)设置DrawerLayout的某一个“抽屉”的标题
getDrawerTitle(@EdgeGravity int edgeGravity)获取DrawerLayout的某一个“抽屉”的标题
----设定和获取抽屉的标题
closeDrawers() 关闭所有的“抽屉”
closeDrawer(View drawerView)
closeDrawer(View drawerView, boolean animate)
closeDrawer(@EdgeGravity int gravity)
closeDrawer(@EdgeGravity int gravity, boolean animate)
-----关闭抽屉的系列方法
openDrawer(View drawerView)打开某一个“抽屉”
openDrawer(View drawerView, boolean animate)打开某一个抽屉,并确认是否播放动画
openDrawer(@EdgeGravity int gravity) 打开某一个“抽屉”
openDrawer(@EdgeGravity int gravity, boolean animate)
-----打开抽屉的系列方法
isDrawerOpen(View drawer)
isDrawerOpen(@EdgeGravity int drawerGravity)
-----判断抽屉是否打开
setScrimColor(@ColorInt int color)
-----方法是设置Drawer抽屉以外的,阴影部分的颜色
DrawerLayout的三种状态
1. STATE_IDLE代表了当前无任何动作,无拖拽等,可以进行费时操作
2. STATE_DRAGGING表示用户正在拖拽中
3. STATE_SETTLING代表用户拖拽已经结束,但是Drawer还没有回复到指定位置(即用户拖拽结束后,自行回复到打开状态或者关闭状态)
google官网上还提供了一遍设置抽屉式导航栏的文章,不在赘述
https://developer.android.google.cn/training/implementing-navigation/nav-drawer