您的位置:首页 > 移动开发 > Android开发

android design库DrawerLayout的使用及实现类似网易云音乐菜单效果

2016-11-21 11:32 176 查看
用网易云音乐的时候感觉它的侧滑菜单效果还是很酷炫的,而且在看过Design库以后就很清楚它应该是用DrawerLayout实现的(讲道理应该是哈)。

网易云音乐效果图:





建一个Activity,在布局中键入如下代码,注释也写了的:

<?xml version="1.0" encoding="utf-8"?>
<!--根布局为DrawLayout,视个人情况而定
为了方便实现沉浸式效果,还是建议以此为根
而且DrawerLayout的高度一定要是MeasureSpec.EXACTLY
详情可查看DrawerLayout的onMeasure方法-->
<android.support.v4.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:openDrawer="start">
<!--内容层,DrawerLayout会根据child的layout_gravity属性来判断谁是content谁是drawer
可查看DrawerLayout的isContentView方法和isDrawerView方法
另外值得一提的是,两个childView的位置如果调换,虽说任然会有菜单,但是相同代码情况下状态栏只是半透明而不是全透明
如果有大神看到,望解我疑惑-->

<!--下面有个background属性,这一步很关键-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/colorPrimaryDark"
android:orientation="vertical">
<!--就是个toolbar
对于这种项目中可能经常用到的东西,建议把他封装起来-->
<include layout="@layout/layout_toolbar"/>
<!--正儿八经的内容-->
<include layout="@layout/content_activity_main" />

</LinearLayout>
<!--菜单
布局随意选择
NavigationView是google专为DrawerLayout量身打造的菜单控件,已menu的形式设置布局,用起来确实方便
而且NavigationView提供一个headerLayout和menu属性来让你个性化你的应用-->
<android.support.design.widget.NavigationView
android:id="@+id/navigationView"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/layout_nav_header"
app:menu="@menu/menu_nav_main">
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>


接下来就是Activity的代码了,像平常实现类似沉浸式效果一样(这个值得一个优秀的Android应用从建项目开始)需要为window设置flag:

void initWindow(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}


而本次就不一样了,还需要为window设置statusBarColor,

void initWindow2(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP )
{
Window window = getWindow();//获取window
window.setStatusBarColor(Color.TRANSPARENT);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
}


由于我只有两部4.2和5.1的手机,本次测试也是在5.1上测试的,至于5.1之前到底是啥效果,我也不知道。。。

先来看看onCreate方法:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWindow2();

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(getString(R.string.description));

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,mDrawerLayout,
toolbar,R.string.openDrawer,R.string.closeDrawer);
mDrawerLayout.addDrawerListener(toggle);
toggle.syncState();

NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView);
navigationView.setNavigationItemSelectedListener(this);

}


其中大部分我想都看得懂吧,来说一说这个ActionBarDrawerToggle,看看官方文档

* This class provides a handy way to tie together the functionality of

* {@link android.support.v4.widget.DrawerLayout} and the framework
ActionBar
to

* implement the recommended design for navigation drawers.

直白点说就是它使DrawerLayout和ActionBar绑定到一起,内部已经实现了对DrawerLayout的控制,

toggle.syncState()方法就是同步DrawerLayout当前状态。

对于NavigationView的操作就不多说了,设置监听器,并在监听器里面处理事件就ok啦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: