前面我們說了自定義側滑菜單,也說了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.javapublic 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
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