android中NavigationDrawer的使用以及添加drawer切换时的动画效果

最近在开发app的时候需要用到NavigationDrawer,但是在添加动画(汉堡图标和箭头图标互转)效果的时候老是出现问题,折腾了好几个小时终于搞定。在这里跟大家分享一下。说明下,我开发时候用的minSdkVersion 是9,也就是本文所说的方法适用于APIlevel 2.3以上的情况,但若minsdk比较高的话会有略微的差异。

1.效果及依赖

NavigationDrawer是Material Design中推崇的一种控件,网易新闻、知乎都有在使用,先上效果图:

图中开启、关闭NavigationDrawer时左上角的动画是通过github上的一个第三方库实现的,详情请见:https://github.com/ikimuhendis/LDrawer

不过前段时间android官方的appcompat-v21包已经开始支持这种效果了。如果你用的是android studio,只需要在app module的build.gradle文件中添加

dependencies {
    compile "com.android.support:appcompat-v7:21.0.+"
}

然后sync(同步)一下就可以使用appcompat包了。此外项目还依赖了support-v4的包,所以在请在dependencies中再加上这一句:

compile 'com.android.support:support-v4:22.0.0'

2.实现步骤

我们以一个MainActivity以及一个左侧拉出的NavigationDrawer为例说明。首先在layout文件夹下边定义一个toolbar.xml,定义Toolbar的样式。

toolbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"/>

Toolbar是API21(android 5.0)中引进的一个控件,Toolbar是以后用来接替Actionbar的,因为Toolbar可以更加自由地设定风格。因为现在的min API 只有9,所以需要使用support包中的Toolbar。

然后定义主布局main_layout.xml文件:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_parent_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 这里引入刚才定义的toolbar -->
    <include layout="@layout/toolbar"/>

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"<pre name="code" class="plain">ActionBarActivity

android:layout_height="match_parent"> <!-- Main layout,这里边放的是MainActivity的内容 --> <FrameLayout android:id="@+id/main_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- Navigation drawer -->

<!--注意这里的layout_width一般设为比屏幕宽度少一些,也就是NavigationDrawer显示时候的宽度,drawer出来时候把整个屏幕遮住不太好看-->

<ListView android:id="@+id/listview_drawer" android:layout_width="@dimen/drawer_width" android:layout_height="match_parent" android:layout_gravity="left|start" /> </android.support.v4.widget.DrawerLayout></LinearLayout>


可以看到这里在DrawerLayout的上方添加了刚才定义的toolbar的布局,而DrawerLayout里边分为两部分,上面那个FrameLayout里边存放的时候本来MainActivity的内容,而下边部分(这里是ListView)里边存放的是NavigationDrawer拉开时候显示的内容。

然后记得主Activity要继承

ActionBarActivity

接下来在主Activity中findViewById找到Toolbar和NavigationDrawer实例,假设实例名为mToolbar和mDrawerLayout,然后添加监听器:

setSupportActionBar(mToolbar);
mDrawerToggle= new ActionBarDrawerToggle(this, mDrawerLayout,mToolbar, R.string.app_name, R.string.app_name);
mDrawerLayout.setDrawerListener(mDrawerToggle);

还有一些Menu菜单和DrawerToggle的状态需要改一下的:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = new MenuInflater(this);
    inflater.inflate(R.menu.menu_main,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

@Override
public void onBackPressed() {
    if(mDrawerLayout.isDrawerOpen(Gravity.START|Gravity.LEFT)){
        mDrawerLayout.closeDrawers();
        return;
    }
    super.onBackPressed();
}

Toolbar已经成功显示出来了,打开、关闭NavigationDrawer左上的图标也能正常切换了。但是有个问题:Toolbar是显示在原来的Actionbar下方的,这时候运行程序,有可能会发现原来Activity的Actionbar没有消失,而新的Toolbar显示在原来的Actionbar的下方,看起来有两个Actionbar了。别慌,我们只需要在activity的theme或者style中添加几个属性:

         <!-- 这一行是为了防止可能出现的异常:java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead. -->
         <item name="windowActionBar">false</item>
         <!--windowActionModeOverlay属性是设置让toolbar重叠在Actionbar上,将其盖住;高版本请用第三行,低版本请用第二行-->
         <item name="android:windowActionBarOverlay">true</item>
        <item name="windowActionModeOverlay">true</item>

然后重新编译运行项目,是不是发现两个Actionbar只剩下一个了呢~

如果minSdkVersion比较高的话,上文中很多空间可以不用使用support的包。

3.参考文献:

appcompat-v21

②https://developer.android.com/training/basics/actionbar/overlaying.html

③http://stackoverflow.com/questions/26818157/actionbardrawertoggle-animation

时间: 2024-12-22 01:16:05

android中NavigationDrawer的使用以及添加drawer切换时的动画效果的相关文章

android中animator及其监听器在cancel及end时的响应问题

1.AnimatorSet中存在多个animator,并且set及animator均添加了监听器的时候: 在start的时候会先分别执行各个animator的监听器的start方法,然后调用set自己的监听器的start方法. 在调用AnimatorSet的cancel()方法的时候,会首先调用set自己的cancel方法,然后循环对每个animator调用cancel及end方法,最后才调用set自己的end方法. 如下,alphaAnim与scaleAnim放到animSet中同时执行,三者

iOS添加到购物车的简单动画效果

[objc] view plaincopyprint? [objc] view plaincopyprint? #pragma mark - 添加到购物车的动画效果 // huangyibiao - (void)addAnimatedWithFrame:(CGRect)frame { // 该部分动画 以self.view为参考系进行 frame = [[UIApplication sharedApplication].keyWindow  convertRect:frame fromView:

Android例子源码模仿安卓微信、云播雷达扫描动画效果

本项目是一个模仿Android微信.云播雷达扫描动画效果的小例子,点击中间的黑色圆圈开始扫描动画,再次点击复位,需要这种效果的朋友可以自己下载看一下,因为是动画效果所以截的静态图有点变形,项目编译版本4.4.2默认编码GBK 源码包下载地址以及运行截图. [点击这里]

Android中通过ActionBar为标题栏添加搜索以及分享视窗

在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果.ActionBar的主要目的是: 1.提供一个用于识别应用程序的标示和用户的位置的专用空间. 2.在不同的应用程序之间提供一致的导航和视觉体验. 3.突出Activity的关键操作(如"搜索"."创建"."共享"等),并且在可预见的方法内给用户提供快捷的访问.

Android中 string.xml资源 如何添加参数?

在android 开发,我们通常会用string.xml资源去设置textview等控件的字符串.而值一般是与程序的运行结果无关的. 但有时需要根据运行的结果来显示到控件中,这时字符串资源就不能写死了. 可以用如下的表示方法来设置: %n$ms:s代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格. 如 :%1$2s表示:字符串资源的第1个string类型参数且该参数之后带有两个空格. %n$md:d代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格.

android中viewPager+fragment实现的屏幕左右切换(进阶篇)

Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match

转 android 从底部弹出一个popuwindow,渐入渐出效果。我这里是用在购物车需要选择购买选项的操作。

最近要改客户端,需要实现一个从底部弹出的popuwindow,像我这种渣渣android技术,能整出popuwindow但是整不出动画,百度之,记录一下. 从下面这个地址转的 http://blog.csdn.net/yxhuang2008/article/details/42617805 最近因为要用到PopupWindow,所以,就在网上搜索了一下,发现挺多关于这样的文章,现在我把它们整理了一下. 1.Android PopupWindow 的使用技巧,http://www.cnblogs.

iOS中关于动画效果的要点

在系统并深入学习iOS动画的过程中,不得不说是个痛苦的过程.没有任何书系统的讲解这方面的知识,网上的文章都讲的支离破碎:很幸运的看到了http://objccn.io这个网站:即使如此,还是花了三天时间:这个是对整体概念模糊到不断清晰,再逐步理顺,最后总结归纳为几个关键点.我想这辈子应该都忘记不了了. iOS上的动画效果绝对赞:最常见的uitable动态效果,当手指在屏幕上下滑动时,列表会跟随其一起上下活动:如果猛的往上一推,还可以看到列表的惯性作用下,还会不断滚动,同时慢慢减速.这个过程根本不

初识android中的动画

动画效果可以大大提高界面的交互效果,因此,动画在移动开发中的应用场景较为普遍.掌握基本的动画效果在成熟的软件开发中不可或缺.除此之外,用户对于动画的接受程度远高于文字和图片,利用动画效果可以加深用户对于产品的印象.因此本文给出安卓设计中几种常见的动画效果. 基础知识 在介绍安卓中的动画效果之前,有必要介绍一下安卓中的图片处理机制.图片的特效包括图形的缩放.镜面.倒影.旋转.平移等.图片的特效处理方式是将原图的图形矩阵乘以一个特效矩阵,形成一个新的图形矩阵来实现的.矩阵Matrix 类,维护了一个