DrawerLayout是V4包下提供的一種左滑右滑抽屜布局效果。
實現效果如下:


因為是官方提供的,所以使用起來也相對的比較簡單。
DrawerLayout 提供
1、當界面彈出的時候,主要內容區會自動背景變黑,當點擊內容區的時候,抽屜布局會消失
2、在屏幕邊緣手勢滑動 會拉出抽屜布局
注意:當按后退鍵的時候,如果抽屜布局正在顯示,則需要關閉抽屜布局
用一個簡單的Demo介紹下:
--------------------------------------------------------------------------------------------
首先布局文件:
布局分為三部分,左中右。中間的是APP顯示的主要內容區,然后看你個人的需求來選擇是要左邊彈出布局,還是右邊彈出布局。
如果選擇是左邊彈出界面還是右邊彈出界面,只要給彈出界面設設置
android:layout_gravity="left" 或者 android:layout_gravity="right" 就可以了
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// 按鈕按下,將抽屜打開
mDrawerLayout.openDrawer(Gravity.LEFT);
}
});
mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
/**
* 當抽屜滑動狀態改變的時候被調用
* 狀態值是STATE_IDLE(閑置--0), STATE_DRAGGING(拖拽的--1), STATE_SETTLING(固定--2)中之一。
* 抽屜打開的時候,點擊抽屜,drawer的狀態就會變成STATE_DRAGGING,然后變成STATE_IDLE
*/
@Override
public void onDrawerStateChanged(int arg0) {
Log.i("drawer", "drawer的狀態:" + arg0);
}
/**
* 當抽屜被滑動的時候調用此方法
* arg1 表示 滑動的幅度(0-1)
*/
@Override
public void onDrawerSlide(View arg0, float arg1) {
Log.i("drawer", arg1 + "");
}
/**
* 當一個抽屜被完全打開的時候被調用
*/
@Override
public void onDrawerOpened(View arg0) {
Log.i("drawer", "抽屜被完全打開了!");
}
/**
* 當一個抽屜完全關閉的時候調用此方法
*/
@Override
public void onDrawerClosed(View arg0) {
Log.i("drawer", "抽屜被完全關閉了!");
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (mDrawerLayout!=null){
if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)){
mDrawerLayout.closeDrawers();
}else super.onBackPressed();
}
}
}
有更多需求的可以看下DrawerLayout的監聽事件:
mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
/**
* 當抽屜滑動狀態改變的時候被調用
* 狀態值是STATE_IDLE(閑置--0), STATE_DRAGGING(拖拽的--1), STATE_SETTLING(固定--2)中之一。
* 抽屜打開的時候,點擊抽屜,drawer的狀態就會變成STATE_DRAGGING,然后變成STATE_IDLE
*/
@Override
public void onDrawerStateChanged(int arg0) {
Log.i("drawer", "drawer的狀態:" + arg0);
}
/**
* 當抽屜被滑動的時候調用此方法
* arg1 表示 滑動的幅度(0-1)
*/
@Override
public void onDrawerSlide(View arg0, float arg1) {
Log.i("drawer", arg1 + "");
}
/**
* 當一個抽屜被完全打開的時候被調用
*/
@Override
public void onDrawerOpened(View arg0) {
Log.i("drawer", "抽屜被完全打開了!");
}
/**
* 當一個抽屜完全關閉的時候調用此方法
*/
@Override
public void onDrawerClosed(View arg0) {
Log.i("drawer", "抽屜被完全關閉了!");
}
});
可能出現的問題:
DrawerLayout界面點擊事件穿透問題,即點擊Drawerlayout上面的區域,會發現該位置DrawerLayout覆蓋掉的區域的控件可以被點擊
解決方法:
//這里設置clickable(true) 必須動態設置 靜態設置沒有效果
//解決問題 側滑菜單出來的時候 點擊菜單上的區域會有點擊穿透問題
mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
drawerView.setClickable(true);
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
}
});
