簡介
Navigation Drawer是在 Material Design 中推出的一種側(cè)滑導(dǎo)航菜單欄控件。包含兩個(gè)部分,一部分是側(cè)滑(DrawerLayout),一部分是導(dǎo)航菜單欄(NavigationView)。
AS新建
利用Android Studio可以快速建立這個(gè)控件
- 在新建項(xiàng)目時(shí),在最后選擇Navigation Drawer Activity

- 在新建Activity時(shí),選擇Navigation Drawer Activity

DrawerLayout
DrawerLayout布局中,由兩部分組成,一部分是內(nèi)容布局,一部分是側(cè)滑菜單布局。其中側(cè)滑菜單布局通過設(shè)置 android:layout_gravity 屬性,來控制是左側(cè)滑,還是右側(cè)滑。參考實(shí)例代碼
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
<TextView
android:id="@+id/content_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/activity_horizontal_margin"
android:text="Hello World!"/>
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:gravity="center"
android:background="@android:color/white"
android:text="導(dǎo)航菜單頁左"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end"
android:gravity="center"
android:background="@android:color/white"
android:text="導(dǎo)航菜單頁右"/>
</android.support.v4.widget.DrawerLayout>
至此,側(cè)滑效果就實(shí)現(xiàn)了。

DrawerLayout中也有一些常會用到的方法,來控制例如打開、關(guān)閉菜單,監(jiān)聽滑動事件等,這里暫時(shí)列舉一些,還是得多看api和源碼。
//打開左側(cè)菜單,同理右側(cè)就是 GravityCompat.END
drawerLayout.openDrawer(GravityCompat.START);
//關(guān)閉左側(cè)菜單,同理右側(cè)就是 GravityCompat.END
drawerLayout.closeDrawer(GravityCompat.START);
//設(shè)置抽屜打開時(shí),剩余擋住內(nèi)容區(qū)域部分的顏色
drawerLayout.setScrimColor(Color.parseColor("#4cff0000"));
//設(shè)置抽屜鎖定模式 LOCK_MODE_LOCKED_OPEN:鎖定 無法滑動
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, GravityCompat.START);
//監(jiān)聽滑動事件
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
//抽屜滑動時(shí)回調(diào)
}
@Override
public void onDrawerOpened(View drawerView) {
//抽屜打開后回調(diào)
}
@Override
public void onDrawerClosed(View drawerView) {
//抽屜關(guān)閉后回調(diào)
}
@Override
public void onDrawerStateChanged(int newState) {
//抽屜滑動狀態(tài)改變時(shí)回調(diào)
switch (newState) {
case DrawerLayout.STATE_DRAGGING:
//拖動狀態(tài)
break;
case DrawerLayout.STATE_IDLE:
//靜止?fàn)顟B(tài)
break;
case DrawerLayout.STATE_SETTLING:
//設(shè)置狀態(tài)
break;
default:
break;
}
}
});
NavigationView
NavigationView是兼容包中提供用來實(shí)現(xiàn)導(dǎo)航菜單控件。使用menu資源填充數(shù)據(jù),可以更簡單高效的實(shí)現(xiàn)導(dǎo)航菜單。
添加依賴
compile 'com.android.support:design:24.1.0'
布局中引用
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
<TextView
android:id="@+id/content_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/activity_horizontal_margin"
android:text="Hello World!"/>
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/navigation_drawer_header"
app:menu="@menu/navigation_drawer_menu"/>
</android.support.v4.widget.DrawerLayout>
NavigationView分為兩部分,一部分是headerLayout,一部分是menu。headerLayout就是對應(yīng)菜單的頂部部分,一般用來顯示用戶信息什么的,menu則對應(yīng)實(shí)際的菜單選項(xiàng)。
定義headerLayout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/colorPrimary">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_margin="10dp"
android:text="HeaderLayout"
android:textColor="@android:color/white"
android:textSize="18sp" />
</RelativeLayout>
定義menu
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/item_dync"
android:icon="@mipmap/ic_menu_dync_selected"
android:title="首頁" />
<item
android:id="@+id/item_explore"
android:icon="@mipmap/ic_menu_explore_selected"
android:title="發(fā)現(xiàn)" />
<item
android:id="@+id/item_message"
android:icon="@mipmap/ic_menu_message_selected"
android:title="消息" />
<item
android:id="@+id/item_person"
android:icon="@mipmap/ic_menu_person_selected"
android:title="我的" />
</group>
<item android:title="其他">
<menu>
<item
android:id="@+id/subitem_01"
android:icon="@mipmap/ic_launcher"
android:title="分享" />
<item
android:id="@+id/subitem_02"
android:icon="@mipmap/ic_launcher"
android:title="設(shè)置" />
<item
android:id="@+id/subitem_03"
android:icon="@mipmap/ic_launcher"
android:title="反饋" />
</menu>
</item>
</menu>
這樣NavigationView就添加成功,效果如下:

Menu Item 的點(diǎn)擊監(jiān)聽
直接使用 NavigationView 的 setNavigationItemSelectedListener() 方法即可
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
case R.id.item_dync:
break;
case R.id.item_explore:
break;
//......
}
return true;
}
});
總結(jié)
Navigation Drawer的用法還是比較簡單的,但是NavigationView的封裝性太高,個(gè)人覺得不是特別實(shí)用,相對自己定義界面可能來的比較方便,或許是自己用的不到家。
關(guān)于抽屜效果,個(gè)人覺得目前而言隨著手機(jī)的屏幕越來越大,導(dǎo)致用戶操作起來不是很方便,現(xiàn)在主流的設(shè)計(jì)還是底部導(dǎo)航欄。