Android 使用CoordinatorLayout实现滚动标题栏效果的实例
作者:jingxian 发布时间:2021-11-16 07:47:09
在Material Design里,CoordinatorLayout通常用来作为顶层视图,来协调处理各个子View之间的动作,从而实现各种动画效果,如Snackbar与FloatingActionButton的配合显示效果,就是以CoordinatorLayout作为根布局来实现的
CoordinatorLayout提供Behaviors接口,子View通过实现Behaviors接口来协调和其它View之间的显示效果,可以这么理解:
CoordinatorLayout让其子View之间互相知道彼此的存在,任意一个子View的状态变化会通过Behaviors通知其它子View,CoordinatorLayout就像一个桥梁,连接不同的View,并使用Behavior处理各个子View之间的通信
效果一:
想实现这样的效果挺简单的,主要是在xml布局文件中进行设置
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--包裹头部View实现滑动效果-->
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat">
<!--标题栏-->
<android.support.v7.widget.Toolbar
android:id="@+id/tb_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationIcon="@android:drawable/ic_dialog_email"
app:title="Title"
app:layout_scrollFlags="scroll" />
<!--Tab导航栏-->
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabMode="fixed"
app:layout_scrollFlags="scroll|enterAlways"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/vp_tab_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>
首先给被AppBarLayout包裹的View添加app:layout_scrollFlags属性,并设置相应的值
• scroll:让该View可以滚动出屏幕
• enterAlways:不需要滚动到顶部,只要有向上滚动的事件就显示该View
• enterAlwaysCollapsed:定义该View何时进入,如果你定义了一个最小高度minHeight,同时enterAlways也定义了,那么该View将会在到达这个最小高度的时候开始慢慢显示,直到滚动组件滚动到顶部时再完全展开
• exitUntilCollapsed:定义该View何时退出,如果你定义了一个最小高度minHeight,那么这个View将在滚动到达这个最小高度时消失
如果不设置layout_scrollFlags属性,那么该View就会固定在屏幕上
enterAlwaysCollapsed和exitUntilCollapsed属性主要是在搭配CollapsingToolbarLayout时使用的
注意:布局的时候,AppBarLayout里面滚动的View要放在固定的View上面
然后在CoordinatorLayout布局里放一个可以滚动的View(不支持ListView),这里使用ViewPager里放置一个RecylerView,为该ViewPager设置app:layout_behavior属性,这里可直接使用Android自带的值
app:layout_behavior=”@string/appbar_scrolling_view_behavior”
设置该值的作用相当于告诉CoordinatorLayout,此View是一个滚动控件,如果该View滚动了,那么设置了layout_scrollFlags属性的控件就可以响应滚动事件了
想实现效果一,总结
使用CoordinatorLayout作为根布局
使用AppBarLayout包裹头部View,并给需要滚动的View设置app:layout_scrollFlags属性
给滑动组件设置app:layout_behavior属性
效果二:
想实现这个效果,需要使用到CollapsingToolbarLayout布局,我们在效果一的基础上更改布局代码
<?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:layout_width="match_parent"
android:layout_height="300dp"
android:fitsSystemWindows="true"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="88dp"
app:expandedTitleMarginStart="66dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<!--拉开后显示的背景图片-->
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/bg_image"
app:layout_collapseMode="pin"/>
<!--标题栏-->
<android.support.v7.widget.Toolbar
android:id="@+id/tb_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:navigationIcon="@android:drawable/ic_dialog_email"
app:title="Title"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.design.widget.CoordinatorLayout>
一些属性的作用
• title:设置Toolbar的标题,注意:如果在CollapsingToolbarLayout中指定了title属性,那么Toolbar中的title属性将会变得无效
• expandedTitleMarginStart:设置下拉伸缩完成后,ToolBar标题文字左边的margin距离
• expandedTitleMarginEnd:设置下拉伸缩完成后,Toolbar标题文字右边的margin距离
• contentScrim:设置Toolbar折叠到顶部后的背景
• layout_collapseMode:折叠效果,有两个值,pin代表从底部拉出,parallax代表从中间展开
看文字可能不太理解collapseMode的显示效果,两个值的具体显示效果如下:
pin:
parallax:
想实现效果二,总结
首先我们设置一个固定的高度给AppBarLayout
然后给AppBarLayout的子View包裹了一层CollapsingToolbarLayout,并设置CollapsingToolbarLayout的滚动属性为scroll|exitUntilCollapsed
最后再为CollapsingToolbarLayout里的子View设置layout_collapseMode属性,指定其展示效果


猜你喜欢
- 场景系统实现中经常需要能够感知配置文件的变化,然后及时更新上下文。实现方案自己起一个单独线程,定时加载文件,实现较简单,但是无法保证能够实时
- CSV是一种通用的、相对简单的文件格式,最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的。那么,C#如何读取
- 建造者模式针对的是复杂对象的构建,比如一个产品有多个部分构成,每个部分都可以单独进行生产,这时候就可以用建造者模式,由Builder构造产品
- 介绍在上一篇“SimpleAdapter“章节中,我们看到了把:ListView和Listview内
- Lua是目前国内使用最多的热更语言,基于Lua的热更框架也非常多,最近学习了一下ToLua的热更框架,主要使用的问题在于C#和Lua之间的互
- 现在很多流行的框架,都可以很快的把分页效果做出来,但是作为一名程序员你必须得知道手写分页的流程:场景效果:一、分页的思路首先我们得知道写分页
- 隐式转换可以通过消除不必要的类型转换来提高源代码的可读性。但是,因为隐式转换不需要程序员将一种类型显式强制转换为另一种类型,所以
- 简介在之前spring boot3文章中我们介绍了,spring boot3的一个重要特性就是支持把spring boot3的应用编译成为G
- 一、项目简述本系统功能包括:分为前端翻后端部分,包括用户,区分晋通用户以及誉里员用户,包括首页展示,部门管理,人事管理,员工管理三个模块等等
- 疑问,确实像往常一样在service上添加了注解 @Transactional,为什么查询数据库时还是发现有数据不一致的情况,想想肯定是事务
- maven3 安装:安装 Maven 之前要求先确定你的 JDK 已经安装配置完成。Maven是 Apache 下的一个项目,目前最新版本是
- 本文实例讲述了Android编程开发中ListView的常见用法。分享给大家供大家参考,具体如下:一、ListView的使用步骤ListVi
- Java程序默认输出为Console,如果要想将Console输出结果保存到文件中,则需要做如下配置:在JAVA程序上右键--> Ru
- Builder模式使用链式结构创建复杂对象,将过程与结果分开,创建过程中可以自行组合。使用场景一个对象,不同组合,不同顺序生成不同的结果优点
- 本文实例为大家分享了C语言实现两个矩阵相乘的具体代码,供大家参考,具体内容如下程序功能:实现两个矩阵相乘的C语言程序,并将其输出代码如下:#
- 项目地址:gitee.com/baojh123/rp…netty-study 这个项目是没用到的,可以删掉,主要是测试
- 1、获取db实例SQLiteDatabase db=dbhelper.getWritableDatabase();2、Cursord对象获取
- android的快捷方式比较简单,就是发一个系统的广播,然后为快捷方式设置Intent---package com.xikang.andro
- 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保
- 超简单,几行代码搞定Android底部导航栏—–应项目需求以及小伙伴的留言,新加了两个方法:设置底部导航栏背景图片添加底部导航栏选项卡切换监