Android原生侧滑控件DrawerLayout使用方法详解
在android的v4包中有一个控件 drawerlayout,主要实现了左拉和右拉菜单,类似于之前的“抽屉”功能,此控件使用简单,效果很柔和,操作起来体验非常好,下面是我实现的一个简单效果的部分截图:
左拉:
右拉:
怎么样?是不是在平时开发的应用中很常见?ok,那么接下来我直接上代码:
activity_sliding.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.drawerlayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent"> <!-- 下面显示的主要是主界面内容 --> <relativelayout android:id="@+id/main_content_frame_parent" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" android:gravity="center"> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:onclick="openleftlayout" android:text="左边" /> <button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginleft="100dp" android:onclick="openrightlayout" android:text="右边" /> </relativelayout> <!-- 左侧滑动栏 --> <relativelayout android:id="@+id/main_left_drawer_layout" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/colorprimary" android:paddingtop="50dp"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerinparent="true" android:text="左边菜单测试" /> </relativelayout> <!-- 右侧滑动栏 --> <relativelayout android:id="@+id/main_right_drawer_layout" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="end" android:background="@color/colorprimary" android:paddingtop="50dp"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerinparent="true" android:text="右边菜单测试" /> </relativelayout> </android.support.v4.widget.drawerlayout>
通过上面的布局文件我们发现 drawerlayout中的子布局分为content、left、right三部分,其中left和right的布局需要在layout中声明android:layout_gravity属性,值分别是start和end。很显然,drawerlayout布局类似一个大容器,超屏布局,将left的布局放在了控件的开始地方,right的布局放在了控件结尾的地方。
drawerslidingactivity.java:
import android.graphics.color; import android.os.bundle; import android.support.v4.app.actionbardrawertoggle; import android.support.v4.widget.drawerlayout; import android.support.v7.app.appcompatactivity; import android.view.view; import android.widget.relativelayout; public class drawwerslidingactivity extends appcompatactivity { // 抽屉菜单对象 private actionbardrawertoggle drawerbar; public drawerlayout drawerlayout; private relativelayout main_left_drawer_layout, main_right_drawer_layout; @override protected void oncreate(bundle arg0) { super.oncreate(arg0); setcontentview(r.layout.activity_slidingmenu); initlayout(); initevent(); } public void initlayout() { drawerlayout = (drawerlayout) findviewbyid(r.id.main_drawer_layout); //设置菜单内容之外其他区域的背景色 drawerlayout.setscrimcolor(color.transparent); //左边菜单 main_left_drawer_layout = (relativelayout) findviewbyid(r.id.main_left_drawer_layout); //右边菜单 main_right_drawer_layout = (relativelayout) findviewbyid(r.id.main_right_drawer_layout); } //设置开关监听 private void initevent() { drawerbar = new actionbardrawertoggle(this, drawerlayout, r.mipmap.ic_launcher, r.string.open, r.string.close) { //菜单打开 @override public void ondraweropened(view drawerview) { super.ondraweropened(drawerview); } // 菜单关闭 @override public void ondrawerclosed(view drawerview) { super.ondrawerclosed(drawerview); } }; drawerlayout.setdrawerlistener(drawerbar); } //左边菜单开关事件 public void openleftlayout(view view) { if (drawerlayout.isdraweropen(main_left_drawer_layout)) { drawerlayout.closedrawer(main_left_drawer_layout); } else { drawerlayout.opendrawer(main_left_drawer_layout); } } // 右边菜单开关事件 public void openrightlayout(view view) { if (drawerlayout.isdraweropen(main_right_drawer_layout)) { drawerlayout.closedrawer(main_right_drawer_layout); } else { drawerlayout.opendrawer(main_right_drawer_layout); } } }
其中要注意的地方一是:drawerlayout.setscrimcolor(color.transparent),此属性设置的是侧滑布局显示时内容之外区域的背景颜色,默认是灰色,这里我为了大家看着清晰就设置成透明的了;二是drawerlayout的监听器actionbardrawertoggle,而actionbardrawertoggle对象我们通过查阅actionbardrawertoggle的源码发现它是drawerlistener的实现类,也就是说actionbardrawertoggle通过实现drawerlistener监听,在此基础上封装了ondraweropened、ondrawerclosed、ondrawerstatechanged和ondrawerslide的事件处理,以便于开发者在滑动过程中自定义要处理的一些操作。
最后检查一下你的as是不是最新版,如果不是的话,则需要在build.gradle中增加以下配置:
compile 'com.android.support:appcompat-v7:24.2.1'