深入解读一下 `com.google.android.material.appbar.CollapsingToolbarLayout`

在这里插入图片描述

简介

在现代 Android 应用中,提供流畅且美观的用户体验是非常重要的。CollapsingToolbarLayoutAndroidX库中 Material Components 的一部分,它提供了一种易于实现的可折叠工具栏效果,常用于提供视觉吸引力的标题栏和动画效果。

本文将详细介绍 CollapsingToolbarLayout 的工作原理、使用方法、以及在实际开发中的一些高级技巧。

CollapsingToolbarLayout 的基本用法

布局结构

要使用 CollapsingToolbarLayout,需要在布局文件中定义一个包含 AppBarLayoutCollapsingToolbarLayout 的结构。通常还会包含一个 Toolbar 以及一个背景视图(例如 ImageView)。

下面是一个基本的布局示例:


<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"><AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"><CollapsingToolbarLayout android:layout_width="match_parent"android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed"><ImageView android:layout_width="match_parent" android:layout_height="match_parent"android:src="@drawable/header_image" android:scaleType="centerCrop"app:layout_collapseMode="parallax" /><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" /></CollapsingToolbarLayout></AppBarLayout><NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"><!-- Your content here --></NestedScrollView>
</CoordinatorLayout>

在这个布局中:

  • CoordinatorLayout 是顶级布局,负责协调子视图的行为。
  • AppBarLayout 包含 CollapsingToolbarLayoutToolbar
  • CollapsingToolbarLayout 内包含一个 ImageView 作为背景,以及一个 Toolbar
  • NestedScrollView 用于滚动内容。

关键属性

CollapsingToolbarLayout 提供了几个关键属性,用于控制其行为:

  • layout_scrollFlags: 定义滚动行为。常用值有 scrollexitUntilCollapsed 等。
  • layout_collapseMode: 定义子视图的折叠模式。常用值有 parallaxpin
  • contentScrim: 定义折叠时显示的背景。
  • collapsedTitleTextAppearanceexpandedTitleTextAppearance: 定义折叠和展开状态下标题的样式。

深入理解 CollapsingToolbarLayout

工作原理

CollapsingToolbarLayoutCoordinatorLayout 的一个子类,它与 AppBarLayout紧密协作,通过监听滚动事件来调整自身的大小和位置。其内部实现了一个自定义的 Behavior,用于处理滚动和折叠逻辑。

当用户滚动 NestedScrollView 时,AppBarLayout 会根据设置的 scrollFlags属性调整自身高度,并触发 CollapsingToolbarLayout 内部视图的折叠和展开动画。

源码解析

我们可以深入看看 CollapsingToolbarLayout 的部分源码,了解其内部实现。

public class CollapsingToolbarLayout extends FrameLayout {// 定义了一些成员变量,包括最大和最小高度、滚动范围等private int           mCollapsingTitleEnabled;private int           mScrimAlpha;private long          mScrimAnimationDuration;private boolean       mScrimsAreShown;private ValueAnimator mScrimAnimator;public CollapsingToolbarLayout(Context context, AttributeSet attrs) {super(context, attrs);// 初始化属性和状态setWillNotDraw(false);ViewCompat.setOnApplyWindowInsetsListener(this,new OnApplyWindowInsetsListener() {@Overridepublic WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {return insets;}});// 初始化其他成员变量}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 计算视图的测量尺寸super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);// 布局子视图,调整位置和大小mCollapsingTextHelper.onLayout(changed, l, t, r, b);}@Overridepublic void draw(Canvas canvas) {super.draw(canvas);// 绘制折叠标题和背景if (mScrimAlpha > 0) {canvas.drawRect(0, 0, getWidth(), getHeight(), mScrimPaint);}mCollapsingTextHelper.draw(canvas);}
}

在这个简化的源码片段中,我们可以看到 CollapsingToolbarLayout 如何通过重写 onMeasureonLayout方法来调整子视图的位置和大小,并在 draw 方法中绘制折叠效果。

CollapsingToolbarLayout 的应用场景

可折叠的工具栏

CollapsingToolbarLayout 最常见的应用场景之一是创建可折叠的工具栏。在这种情况下,可以根据滚动位置动态调整工具栏的大小和背景。

视觉吸引力的标题栏

通过使用 CollapsingToolbarLayout,可以实现视觉吸引力的标题栏,例如在应用启动时显示大的背景图片和标题,随着用户滚动内容,标题栏逐渐折叠成标准的工具栏。

动态背景变化

还可以利用 CollapsingToolbarLayout 实现动态背景变化,例如在用户滚动时改变工具栏的背景颜色或图片,从而提供更丰富的视觉效果。

高级技巧

自定义折叠效果

通过自定义 layout_collapseMode 属性,可以实现更复杂的折叠效果。例如,可以结合 parallaxpin模式,在滚动过程中同时实现视差滚动和固定工具栏的效果。

动画过渡

可以使用 ValueAnimatorObjectAnimatorCollapsingToolbarLayout 添加平滑的动画过渡效果,使折叠和展开更加流畅。

ValueAnimator animator = ValueAnimator.ofInt(0, 255);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate (ValueAnimator animation){int alpha = (int) animation.getAnimatedValue();mScrimPaint.setAlpha(alpha);invalidate();}
});animator.setDuration(1000);
animator.start();

响应窗口插入

使用 WindowInsets 可以使 CollapsingToolbarLayout 更好地适应不同的屏幕和窗口布局,例如处理状态栏和导航栏的插入。

ViewCompat.setOnApplyWindowInsetsListener(collapsingToolbarLayout,new OnApplyWindowInsetsListener() {@Overridepublic WindowInsetsCompat onApplyWindowInsets (View v, WindowInsetsCompat insets){collapsingToolbarLayout.setPadding(0, insets.getSystemWindowInsetTop(), 0, 0);return insets;}
});

注意事项

性能优化

由于 CollapsingToolbarLayout 可能涉及大量的绘制操作和动画效果,注意优化性能,例如避免不必要的重绘和过度的复杂布局。

兼容性问题

确保在不同版本的 Android 系统上进行测试,避免由于版本差异导致的兼容性问题。使用 Material Components时,确保依赖库的版本是最新的,并符合应用的需求。

结论

CollapsingToolbarLayout是一个强大的工具,能够帮助开发者轻松实现美观且流畅的折叠工具栏效果。通过理解其工作原理和使用方法,以及一些高级技巧和注意事项,可以更好地将其应用到实际开发中,从而提升应用的用户体验和视觉效果。

希望本文对你理解 CollapsingToolbarLayout 有所帮助,如果有任何问题或建议,欢迎留言讨论。

感谢阅读,Best regards!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

已解决Writing ‘modem_a‘FAILED (remote: ‘Operation not permitted‘

今天用可视化工具FastbootEnhance线刷&#xff0c;没有注意到日志报错&#xff0c;开机后黑屏&#xff0c;电脑能检测到是开机状态&#xff0c;电源键按下有声音。 排除线刷包问题&#xff0c;翻看FastbootEnhance的日志&#xff0c;它的日志放到记事本全屏方便观看&#xff0…

项目1111

中文显示姓名列和手机号 SELECT contact_name AS 姓名, contact_phone AS 手机号 FROM 2_公司id; 使用explain测试给出的查询语句&#xff0c;显示走了索引查询 EXPLAIN SELECT * FROM 7_订单数量 WHERE countid LIKE e%; 统计用户订单信息&#xff0c;查询所有用户的下单数量…

Prometheus中添加基本身份验证功能

在Prometheus中添加基本身份验证功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、生成哈希密码 首先&#xff0c;需要安装bcrypt工具&#xff0c;用于生成哈希密码。这可以通过Python的bcrypt库来完成。如果未安装&#xff0c;可以使用pip进行安装。 创建一个Python脚…

Android性能优化——卡顿优化

文章目录 一、从XML到屏幕上的展示造成跳帧的因素有那些发现问题定位问题定位代码 一、从XML到屏幕上的展示 数据加载阶段 数据控制阶段 数据展示阶段 xml —> view onCreat —> 解析layout.xml resume —> view —> wms ViewRootImpl UI 绘制流程 &#xff1a;测…

计算机网络之数据通信原理

1.通信系统的基本组成 信源&#xff1a;信息的发出者&#xff1b; 信宿&#xff1a;信息的接收者&#xff1b; 载体&#xff1a;信息的传送通道&#xff1b; 变换器&#xff1a;将信息变换成载体上可传输的信号&#xff1b; 反变换器&#xff1a;将载体上传输的信号变换成信…

Java中网络安全的基础知识

Java中网络安全的基础知识 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代互联网应用中&#xff0c;网络安全是一个至关重要的话题。随着网络攻击和数据…

Java零基础-集合:TreeSet

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

SQL基础:掌握数据查询与操作的核心技能(四)

引言&#xff1a;数据操作的语言艺术 在前一章节《数据库与表的基本操作》中&#xff0c;我们深入了解了如何创建、管理数据库和表&#xff0c;构建了数据存储的基础框架。本章节&#xff0c;我们将深入探索SQL语言&#xff0c;它是数据库管理系统的通用语言&#xff0c;用于数…

SpringBoot集成Druid数据库连接池并配置可视化界面和监控慢SQL

pom.xml <!-- Druid 数据库连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.23</version></dependency>application.yml spring:jackson:date-…

明星周边物品交易购物系统

摘 要 随着明星文化的兴起和粉丝经济的蓬勃发展&#xff0c;明星周边产品的市场需求日益增长。明星周边物品包括各种与明星相关的商品&#xff0c;如T恤、海报、手办、签名照等&#xff0c;它们成为粉丝们表达对明星喜爱和支持的方式之一。通过“星光璀璨”来形象化地表达明星…

Flask的 preprocess_request

理解 Flask 类似框架中的 preprocess_request 方法 在 Flask 类似的 web 框架中&#xff0c;preprocess_request 方法是一个关键组件。它在请求被分派之前调用&#xff0c;用于执行一些预处理操作。让我们一步一步来理解这个方法的工作原理。 1. 方法概述 首先&#xff0c;我…

【Android面试八股文】说一说Handler的sendMessage和postDelay的区别?

文章目录 一、`sendMessage` 方法1.1 主要用法1.2 适用场景二、`postDelayed` 方法2.1 主要用法2.2 适用场景三、 区别总结3.1 区别3.2 本质上有差别吗?四、实例对比4.1 使用`sendMessage`4.2 使用`postDelayed`五、结论Handler类在Android中用于消息传递和任务调度。 sendMe…

基于Java技术的在线学习平台系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术&#xff0c;基于SpringBoot框架 工具&#xff1a;Eclipse、Navicat、M…

n次方差公式推导

1. 推导 数列求和 S a 1 a 2 ⋯ a n , 公比为 q q S a 2 a 3 ⋯ a n 1 ( 1 − q ) S a 1 − a n 1 a 1 : 1 化简 ( 1 ) ( 3 ) S 1 q ⋯ q n − 1 ( 1 − q ) S 1 − q n ( 4 ) 代入 ( 5 ) ( 1 − q ) ( 1 q ⋯ q n − 1 ) 1 − q n q : b a 代入 ( 6 )…

Qt 学习(一) addressbook

Qt Demo: addressbook (1)创建项目&#xff1a;选择不创建界面&#xff0c;即UI&#xff0c;此时会自动生成的文件如图所示&#xff1a; QApplication&#xff1a; MainWindow 继承自 QMainWindow&#xff0c;根据需要设计的界面样式。 (2)确定MainWindow 的成员变量 首先&…

Jetpack架构组件_Navigaiton组件_1.Navigaiton切换Fragment

1.Navigation主要作用 方便管理Fragment &#xff08;1&#xff09;方便我们管理Fragment页面的切换 &#xff08;2&#xff09;可视化的页面导航图&#xff0c;便于理清页面间的关系。 &#xff08;3&#xff09;通过destination和action完成页面间的导航 &#xff08;4&a…

算尽天下财,铸就大明梦 —— 大明钱算子夏元吉的传奇一生

仕途生涯开始&#xff1a;洪武二十三年&#xff08;1390年&#xff09;&#xff0c;夏元吉因精通《诗经》&#xff0c;由湖广乡荐参加礼部组织的会试&#xff0c;虽未中举&#xff0c;但他并未气馁&#xff0c;反而更加努力地学习。洪武二十四年&#xff08;1391年&#xff09;…

通讯:单片机串口和电脑通讯

目录 1.串口输出数据到电脑 硬件部分 串口输出数据到电脑的软件软件部分&#xff1a; 相关问题&#xff1a; 2.单片机串口--485--485转USB--电脑 串口&#xff0c;芯片&#xff0c;转换器&#xff0c;设备之间的通讯的接线&#xff0c;都是要TX--RX, RX--TX 交叉连接。 单…

充电桩现场安装施工流程

摘要&#xff1a;在化石能源日益紧缩的今天&#xff0c;新能源车辆逐渐走进了千家万户&#xff0c;与传统化石能源车辆相比&#xff0c;以电驱动的新能源车辆能源利用率高&#xff0c;缩短了能源传递过程&#xff0c;实现了能源有效利用。根据能量守恒定律可知&#xff0c;任何…

V-Series Avalon-MM DMA Interface for PCIE IP核

目录 1. IP概述 2. Avalon-MM DMA Ports 3. 参数设置 3.1 系统设置 3.2 基址寄存器 (BAR) 设置 3.3 设备识别寄存器 3.4 PCI Express和PCI功能参数 3.4.1 Device Capabilities 3.4.2 Error Reporting 3.4.3 Link Capabilities 3.4.4 MSI and MSI-X Capabilities …