一、先看一下Demo的效果图
二、DrawerLayout的使用
很多APP都喜欢用侧划菜单,比如QQ、酷狗等。但侧划菜单怎么做呢?牛的人自定义,差一点的就使用开源库SlidingMenu。但Android有原生的,现在我们就拿原生的DrawerLayout来玩玩。
三、先看Activity关联的布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dl"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--内容布局-->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="#87845124"
android:gravity="center"
android:onClick="toggle"
android:padding="12dp"
android:text="Context"
android:textSize="28dp" />
</FrameLayout>
<!--android:layout_gravity="start" 表示从左边拉出,左边的布局-->
<!--android:layout_gravity="end" 表示从右边拉出,右边的布局-->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="#fff">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="right"
android:textSize="18dp" />
</FrameLayout>
</android.support.v4.widget.DrawerLayout>
1.设置属性android:layout_gravity="start" 表示从左边拉出,左边的布局
- 设置属性android:layout_gravity="end" 表示从右边拉出,右边的布局
三、Activity的代码
public class DrawerLayoutActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_drawer_layout);
mDrawerLayout = findViewById(R.id.dl);
try {
// 去看源码就可以知道,mMinDrawerMargin 默认是64dp
// 用反射来设置划动出来的距离 mMinDrawerMargin
// 爽YY,可以定制UI设计的划动出来的距离
Field mMinDrawerMarginField = DrawerLayout.class.getDeclaredField("mMinDrawerMargin");
mMinDrawerMarginField.setAccessible(true);
int minDrawerMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
50, getResources().getDisplayMetrics());
mMinDrawerMarginField.set(mDrawerLayout, minDrawerMargin);
} catch (Exception e) {
e.printStackTrace();
}
// 设置阴影颜色
mDrawerLayout.setScrimColor(Color.parseColor("#55000000"));
// 设置边缘颜色
mDrawerLayout.setDrawerShadow(new ColorDrawable(Color.parseColor("#22000000")), Gravity.RIGHT);
mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
// 这里可以写动画
}
@Override
public void onDrawerOpened(View drawerView) {
// 打开的时候,手势可以划动
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
@Override
public void onDrawerClosed(View drawerView) {
// 关闭的时候,手势不可以划动
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
@Override
public void onDrawerStateChanged(int newState) {
}
});
// 默认设置,手势不可以划动
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
public void toggle(View view) {
// 如果没有打开,就去打开
if (!mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
mDrawerLayout.openDrawer(Gravity.RIGHT);
}
}
}
使用DrawerLayout优点:
- 使用简单,可定制强,划动出来的距离也可以通过反射设置。
- 是Android原生的控件,不用关联三方库。