zoukankan      html  css  js  c++  java
  • 【转】Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用

    Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用

    分类: Android UI
     
     

    【转载请注明出处:http://blog.csdn.net/feiduclear_up/article/details/46514791 CSDN 废墟的树】

    这里写图片描述

    上一篇博客我们学习了Android Design Support Library库中的 是个简单的组件,不了解的童鞋可以参考之前的博客 
    Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用

    这篇博客我们继续学习Design库中的其他四个组件,分别是AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout。

    同样,你需要在你的工程中引入

    compile 'com.android.support:design:22.2.0'
    • 1

    AppBarLayout

    效果图是这样的

    这里写图片描述

    AppBarLayout 是继承LinerLayout实现的一个ViewGroup容器组件,它是为了Material Design设计的App Bar,支持手势滑动操作。

    默认的AppBarLayout是垂直方向的,它的作用是把AppBarLayout包裹的内容都作为AppBar。类似上面图片贴出来的效果,代码布局如下:

    <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                android:minHeight="?attr/actionBarSize"></android.support.v7.widget.Toolbar>
    
            <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll"
                app:tabIndicatorColor="@android:color/holo_red_dark"
                app:tabSelectedTextColor="@android:color/holo_red_dark"
                app:tabTextColor="@android:color/black" />
    
        </android.support.design.widget.AppBarLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    此处将Toolbar 和Tablayout的组合部分共同构成 AppBar的效果。

    注意: AppBarLayout必须作为Toolbar的父布局容器

    AppBarLayout是支持手势滑动效果的,不过的跟CoordinatorLayout配合使用,接下来学习一下CoordinatorLayout组件怎么使用?

    CoordinatorLayout

    这里写图片描述

    从开发文档中可以了解到,CoordinatorLayout是一个增强型的FrameLayout。它的作用有两个

    1. 作为一个布局的根布局
    2. 最为一个为子视图之间相互协调手势效果的一个协调布局

    例如一下布局代码:

     <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|enterAlways" />
    
            <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabGravity="fill" />
    
    
        </android.support.design.widget.AppBarLayout>
    
        <!--可滑动的布局内容-->
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
        <android.support.design.widget.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_discuss"
            android:layout_gravity="bottom|end"/>
    
    
    </android.support.design.widget.CoordinatorLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    从上面布局看到,CoordinatorLayout协调布局中包裹了两个布局,一个是NestedScrollView,一个是AppBarLayout,以及FAB按钮。

    我们来看看CoordinatorLayout是怎么来协调这两个子视图手势操作的。

    1.由于CoordinatorLayout是FrameLayout布局,我们可以通过

    android:layout_gravity="bottom|end"
    • 1

    属性来控制组件在整个布局中的位置,比如上面效果中的FAB就是通过android:layout_gravity=”bottom|end”来确定 FAB的位置在底端的最右边的位置。

    2.为了达到上面效果图的手势动画效果,我们必须做如下设置,通过app:layout_scrollFlags=”scroll|enterAlways” 属性来确定哪个组件是可滑动的

    设置的layout_scrollFlags有如下几种选项:

    • scroll: 所有想滚动出屏幕的view都需要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。
    • enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。
    • enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。
    • exitUntilCollapsed: 滚动退出屏幕,最后折叠在顶端。

    我们上面的布局中 给Toolbar设置了app:layout_scrollFlags属性,因此,Toolbar是可以滚动出屏幕,且向下滚动有可以出现。

    3.为了使得Toolbar可以滑动,我们必须还得有个条件,就是CoordinatorLayout布局下包裹一个可以滑动的布局,比如 RecyclerView,NestedScrollView(经过测试,ListView,ScrollView不支持)具有滑动效果的组件。并且给这些组件设置如下属性来告诉CoordinatorLayout,该组件是带有滑动行为的组件,然后CoordinatorLayout在接受到滑动时会通知AppBarLayout 中可滑动的Toolbar可以滑出屏幕了。

    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    • 1

    总结: 为了使得Toolbar有滑动效果,必须做到如下三点:

    1. CoordinatorLayout必须作为整个布局的父布局容器。
    2. 给需要滑动的组件设置 app:layout_scrollFlags=”scroll|enterAlways” 属性。
    3. 给你的可滑动的组件,也就是RecyclerView 或者 NestedScrollView 设置如下属性:
     app:layout_behavior="@string/appbar_scrolling_view_behavior"
    • 1

    CollapsingToolbarLayout

    这里写图片描述

    CollapsingToolbarLayout包裹 Toolbar 的时候提供一个可折叠的 Toolbar,一般作为AppbarLayout的子视图使用。

    CollapsingToolbarLayout 提供以下属性和方法是用:

    1. Collapsing title:ToolBar的标题,当CollapsingToolbarLayout全屏没有折叠时,title显示的是大字体,在折叠的过程中,title不断变小到一定大小的效果。你可以调用setTitle(CharSequence)方法设置title。
    2. Content scrim:ToolBar被折叠到顶部固定时候的背景,你可以调用setContentScrim(Drawable)方法改变背景或者 在属性中使用 app:contentScrim=”?attr/colorPrimary”来改变背景。
    3. Status bar scrim:状态栏的背景,调用方法setStatusBarScrim(Drawable)。还没研究明白,不过这个只能在Android5.0以上系统有效果。
    4. Parallax scrolling children:CollapsingToolbarLayout滑动时,子视图的视觉差,可以通过属性app:layout_collapseParallaxMultiplier=”0.6”改变。
    5. CollapseMode :子视图的折叠模式,有两种“pin”:固定模式,在折叠的时候最后固定在顶端;“parallax”:视差模式,在折叠的时候会有个视差折叠的效果。我们可以在布局中使用属性app:layout_collapseMode=”parallax”来改变。

    布局代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="160dp">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:expandedTitleMarginEnd="64dp"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginStart="48dp"
                app:statusBarScrim="?attr/colorPrimary"
                app:layout_scrollFlags="scroll|exitUntilCollapsed"
    
                >
    
                <ImageView
                    android:id="@+id/image"
                    app:layout_collapseParallaxMultiplier="0.6"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="fitXY"
                    android:src="@drawable/image"
                    app:layout_collapseMode="parallax" />
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"></android.support.v7.widget.Toolbar>
            </android.support.design.widget.CollapsingToolbarLayout>
    
    
        </android.support.design.widget.AppBarLayout>
    
          <--your scroll content-->可滑动的内容
        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        </android.support.v4.widget.NestedScrollView>
    
        <android.support.design.widget.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_discuss"
            app:backgroundTintMode="multiply"
            app:layout_anchor="@id/appbar"
            app:layout_anchorGravity="bottom|end|right"></android.support.design.widget.FloatingActionButton>
    
    </android.support.design.widget.CoordinatorLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    总结: CollapsingToolbarLayout主要是提供一个可折叠的Toolbar容器,对容器中的不同视图设置layout_collapseMode折叠模式,来达到不同的折叠效果。

    1.Toolbar 的高度layout_height必须固定,不能 “wrap_content”,否则Toolbar不会滑动,也没有折叠效果。 
    2.为了能让FloatingActionButton也能折叠且消失出现,我们必须给FAB设置锚点属性

    app:layout_anchor="@id/appbar"
    • 1

    意思是FAB浮动按钮显示在哪个布局区域。 
    且设置当前锚点的位置

    app:layout_anchorGravity=”bottom|end|right”

    意思FAB浮动按钮在这个布局区域的具体位置。 
    两个属性共同作用才是的FAB 浮动按钮也能折叠消失,出现。

    3.给需要有折叠效果的组件设置 layout_collapseMode属性。

    【转载请注明出处:http://blog.csdn.net/feiduclear_up/article/details/46514791 CSDN 废墟的树】

    这里写图片描述

    用于侧滑菜单中的menu布局。之前Google在V4包中推出自己的 DrawerLayout作为抽屉侧滑菜单,标准使用方法可以参考 google 原生态 抽屉式侧滑菜单 Android DrawerLayout 布局的使用介绍。 
    当时的官方布局是这样的:

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:id="@+id/drawer_layout"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent" >  
    
        <!-- the main content view -->  
    
        <FrameLayout  
            android:id="@+id/frame_content"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent" >  
        </FrameLayout>  
    
        <!-- the navigetion view -->  
    
        <ListView  
            android:id="@+id/drawer_list"  
            android:layout_width="240dp"  
            android:layout_height="match_parent"  
            android:layout_gravity="start"  
            android:background="#9999cc"  
            android:choiceMode="singleChoice"  
            android:divider="@android:color/transparent"  
            android:dividerHeight="0dp" >  
        </ListView>  
    
    </android.support.v4.widget.DrawerLayout>  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    其实这次谷歌只是将上面的ListView布局替换成NavigationView了。简化了之前ListView写适配器的繁琐。

    先如今布局改成如下:

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <!-- the main content view -->
    
        <include layout="@layout/layout_content" />
    
        <!-- the navigetion view -->
    
        <android.support.design.widget.NavigationView
            android:id="@+id/navigationView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/layout_header"
            app:menu="@layout/layout_menu">
    
        </android.support.design.widget.NavigationView>
    
    </android.support.v4.widget.DrawerLayout> 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    其中NavigationView 中的 android:layout_gravity=”start” 属性来控制抽屉菜单从哪边滑出,一般“start ”从左边滑出,“end”从右边滑出。

    这里最主要的两个属性分别是: 
    1.app:headerLayout: 给NavigationView添加头部布局 
    2.app:menu:给NavigationView添加menu菜单布局

    app:headerLayout布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@drawable/img1"
        android:gravity="center"
        android:orientation="vertical">
    
        <ImageView
            android:layout_width="125dp"
            android:layout_height="125dp"
            android:scaleType="centerCrop"
            android:src="@drawable/image" />
    
        <TextView
            android:layout_marginTop="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="CSDN废墟的树博客"
            android:textColor="@android:color/white" />
    
    </LinearLayout>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    app:menu 布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <group
            android:checkableBehavior="single"
            android:title="Home items">
    
            <item
                android:id="@+id/nav_blog"
                android:icon="@drawable/ic_account_balance_black_24dp"
                android:title="博客地址" />
    
            <item
                android:id="@+id/nav_ver"
                android:icon="@drawable/ic_error_outline_black_36dp"
                android:title="版本信息" />
    
            <item
                android:id="@+id/nav_about"
                android:icon="@drawable/ic_error_outline_black_36dp"
                android:title="关于我" />
    
        </group>
    
        <item android:title="Sub items">
    
            <menu>
    
                <item
                    android:id="@+id/sub_exit"
                    android:icon="@drawable/ic_power_settings_new_black_36dp"
                    android:title="退出应用" />
    
                <item
                    android:id="@+id/sub_switch"
                    android:icon="@drawable/ic_settings_applications_black_36dp"
                    android:title="切换主题" />
            </menu>
        </item>
    
    </menu>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    代码中控制NavigationView

    private void initNavigationView(){
            navigationView = (NavigationView) findViewById(R.id.navigationView);
            drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            //设置侧滑菜单选择监听事件
            navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    menuItem.setChecked(true);
                    //关闭抽屉侧滑菜单
                    drawerLayout.closeDrawers();
                    return true;
                }
            });
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home){
                //打开抽屉侧滑菜单
                drawerLayout.openDrawer(GravityCompat.START);
            }
            return super.onOptionsItemSelected(item);
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    关于NavigationView中item的字体颜色和icon选中状态颜色是去当前主题theme中的

    <--正常状态下字体颜色和icon颜色-->
    <item name="android:textColorPrimary">@android:color/darker_gray</item>
    <--选中状态icon的颜色和字体颜色-->
     <item name="colorPrimary">@color/accent_material_light</item>
    • 1
    • 2
    • 3
    • 4

    当然你可以通过如下方法或者属性来改变这一状态:

    1. setItemBackgroundResource(int):给menu设置背景资源,对应的属性app:itemBackground
    2. setItemIconTintList(ColorStateList):给menu的icon设置颜色,对应的属性app:itemIconTint
    3. setItemTextColor(ColorStateList):给menu的item设置字体颜色,对应的属性app:itemTextColor

    至此,Android Support Design Library库的使用基本学习完。

    源码地址 https://github.com/xujinping/AndroidDesignLibrary/tree/master

  • 相关阅读:
    关于PTA平台上使用python2/3书写代码误判问题
    随笔小记--乔帮主传
    随笔小记--读李安传
    Git与GitHub的简单了解(3)
    Git与GitHub的简单了解(2)
    Git与GitHub的简单了解(1)
    学习SFrame,根据GraphLab库
    结课:应用实例--照片字符识别 (photo OCR)
    大数据下的机器学习
    Java8之Stream用法
  • 原文地址:https://www.cnblogs.com/DarkMaster/p/4647766.html
Copyright © 2011-2022 走看看