Android抽屉动画-----DrawerLayout的简单使用
一、简介
DrawerLayout 是 Google 推出的一款能够实现侧滑效果的控件,可以实现如同网易云音乐的左侧菜单效果。实现简单,且提供了很多操作方法,可满足日常的使用。由于 AndroidX 已替代 support 使用,故 DrawerLayout 类目前位于 androidx.drawerlayout.widget 包下。
官方文档:https://developer.android.google.cn/reference/androidx/drawerlayout/widget/DrawerLayout.html?hl=en
二、修改布局文件
DrawerLayout 作为界面的顶层容器,允许用户从界面的一个或两个垂直侧边缘拖拽出界面。建议将 DrawerLayout 做为界面的根布局来使用,以避免可能会出现的触摸事件被屏蔽问题
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/DrawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.drawerlayout.widget.DrawerLayout>
三、添加主界面和侧滑界面
DrawerLayout 包含主界面和侧滑界面。对于 DrawerLayout 内的界面布局有以下几个要求:
1.主界面布局一定要位于所有侧滑界面布局之前,宽度与高度应设置为 match_parent ,并且不能包含 layout_gravity 标签。
2.侧滑界面必须设置 layout_gravity 属性,且当该属性值为 start 或 left 时该侧滑界面从左侧滑出,当该属性值为 end 或 right 时,该侧滑界面从右侧滑出。
3.侧滑界面的高度属性建议设定为 match_parent ,宽度属性建议设置为一个常数。
4. 界面任意一个垂直边缘最多允许配置一个侧滑界面,如果在布局时为单个垂直边缘配置了多个侧滑界面,则运行时将引发异常。
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--主界面不需要设置layout_gravity-->
<LinearLayout
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:text="这是主界面"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<!--侧滑界面设置layout_gravity:start或者left为左滑,end或者right为右滑-->
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="300dp"
android:background="#22aa22"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="start">
<TextView
android:text="这是侧滑界面"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ListView
android:id="@+id/id_lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="#CD853F"
android:dividerHeight="2dp" >
</ListView>
<Button
android:id="@+id/btn"
android:text="按钮"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
四、控制侧滑界面的状态
DrawerLayout 提供了以下方法操作侧滑界面
void closeDrawer(View drawerView) \\ 关闭侧滑界面
void openDrawer(View drawerView) \\ 打开侧滑界面
boolean isDrawerOpen(View drawer) \\ 判断侧滑界面是否处于打开状态
以上三个个方法的传入参数均应是侧滑界面布局对象。例如,打开上个例子中创建的左侧侧滑界面
DrawerLayout mdrawerLayout = findViewById(R.id.drawerLayout);
drawerLayout.openDrawer(findViewById(R.id.left_layout));
五、为侧滑界面添加事件监听器
通过 id 可以获取到布局文件中插入的 DrawerLayout 对象来进行操作, DrawerLayout 类提供了包括以下展示的多个函数来进行操作。
mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
//侧滑界面滑动中回调该方法
}
@Override
public void onDrawerOpened(@NonNull View drawerView) {
//侧滑界面打开时回调该方法
}
@Override
public void onDrawerClosed(@NonNull View drawerView) {
//侧滑界面关闭时回调该方法
}
@Override
public void onDrawerStateChanged(int newState) {
//侧滑界面状态改变时回调该方法
}
});
需要注意的是避免再动画播放期间执行例如界面布局类型的复杂操作,以避免动画出现卡顿。
六、侧滑界面上控件的响应事件
侧滑界面上控件的响应事件可以在主界面上得到响应。
//侧滑界面上的按钮
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"点击了侧滑界面上的按钮",Toast.LENGTH_LONG).show();
}
});
//侧滑界面上的列表项点击事件
ch_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this,"点击了"+str[i],
Toast.LENGTH_LONG).show();
}
});