DrawerLayout是Support Library包中實現了側滑菜單效果的控制項,可以說DrawerLayout是因為第三方控制項如SlidingMenu等出現之後,google借鑒而出現的產物。DrawerLayout分為側邊菜單和主內容區兩部分,側邊菜單可以根據手勢展開與隱藏(drawerLa ...
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在裡面判斷 看下效果: