DrawerLayout 实现SlidingMenu侧边栏菜单效
2016-10-26 本文已影响2659人
曾经的追风少年
先看效果图:
![
]6ZLN7KJ6QO.png](http:https://img.haomeiwen.com/i2787812/3b2f620b063bbf0b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
drawerLayout是Support Library包中实现了侧滑菜单效果的控件,使用起来非常的简单。
1、概述
drawerLayout其实是一个布局控件,跟LinearLayout等控件是一样,但是drawerLayout带有滑动的功能。只要按照drawerLayout的规定布局方式写完布局,就能有侧滑的效果。如下:
<!-- android:clickable="true"表示侧滑界面可以被点击(当侧滑打开时,拦截频幕的点击事件) -->
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Content 内容-->
<FrameLayout
android:id="@+id/content_frame_left"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- Sliding Left 左边 -->
<!--<FrameLayout
android:id="@+id/sliding_frame"
android:layout_width="200dp"
android:layout_height="match_parent" />-->
<!-- Sliding Right 右边 -->
<FrameLayout
android:id="@+id/sliding_frame"
android:layout_width="200dp"
android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>
写完布局,然后在activity中初始化,根据自己的需求替换内容布局和侧滑布局(不一定用framLayout,可以使用任何其他的布局):
getSupportFragmentManager().beginTransaction().replace(R.id.fram_context, new ContentFragment()).commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fram_sliding, new SlidingFragment()).commit();
// 设置分割线已经滑动方向
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,GravityCompat.START);
// 禁止手势滑动(使用开关控制)
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
// 添加DrawerListener监听器
mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
// 抽屉改变时使用
View mContent = mDrawerLayout.getChildAt(0);
/*
* 当菜单栏滑出时,内容界面随滑动方向平移(模拟SlidingMenu效果)
* ViewHelper为 nineoldandroids.jar中的工具类
*/
ViewHelper.setTranslationX(mContent,-fram_sliding.getMeasuredWidth() * slideOffset);
}
@Override
public void onDrawerOpened(View drawerView) {
// 打开抽侧边栏
LogUtil.d("DrawerLayout is opened");
}
@Override
public void onDrawerClosed(View drawerView) {
// 关闭侧边栏
LogUtil.d("DrawerLayout is closed");
}
@Override
public void onDrawerStateChanged(int newState) {
// 改变侧边栏的状态
LogUtil.d("状态改变"+newState);
}
});
}
这里禁止了手势滑动打开关闭侧边栏,使用的是按钮监听控制:
functionImg.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (fram_sliding.isShown()) {
//如果侧边栏处于显示状态,关闭侧边栏,否则打开侧边栏
mDrawerLayout.closeDrawer(fram_sliding);
}else {
mDrawerLayout.openDrawer(fram_sliding);
}
}
});
这里只实现了右边菜单栏,由于DrawerLayout侧边栏打开时,content布局不会随其平移,为了实现SlidingMenu的效果,加入了nineoldandroids.jar,使用ViewHelper来平移content布局。