深入解读一下 `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.rhkb.cn/news/361125.html

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

相关文章

避开常见的坑,快速制作一个免费、交互式景区导游地图

目录 1 前言 2 注册登录 3 增加景区&#xff0c;注意设置地图中心点和级别 3.1 确定地图位置和缩放级别 3.2 新增景区&#xff0c;输入几个文本项目 3.3 可以继续调整地图位置和级别 4 增加景点 4.1 点击景点跳转错误 5 新增景区和景点介绍帖子&#xff0c;需要催一下…

【PyTorch】【机器学习】图片张量、通道分解合成和裁剪

一、导入所需库 from PIL import Image import torch import numpy as np import matplotlib.pyplot as plt二、读取图片 pic np.array(Image.open(venice-boat.jpg))上述代码解释&#xff1a;先用Image.open()方法读取jpg格式图片&#xff0c;再用np.array()方法将图片转成…

各大广告商竞相厮杀下,诞生了一个偏门的副业方式

前段时间&#xff0c;想买摩托车&#xff0c;但是媳妇不让买&#xff0c;所以我打算偷偷买&#xff0c;然后萌生了去摆摊赚钱的想法&#xff0c;但是还没有实施就在网上接触到了“某赚”APP&#xff0c;于是一发不可收拾&#xff0c;用我的话来说&#xff0c;我做的不是副业&am…

Map-JAVA面试常问

1.HashMap底层实现 底层实现在jdk1.7和jdk1.8是不一样的 jdk1.7采用数组加链表的方式实现 jdk1.8采用数组加链表或者红黑树实现 HashMap中每个元素称之为一个哈希桶(bucket),哈希桶包含的内容有以下4项 hash值&#xff08;哈希函数计算出来的值&#xff09; Key value next(…

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…

.NET C# 使用GDAL将mdb转换gdb数据

.NET C# 使用GDAL将mdb转换gdb数据 目录 .NET C# 使用GDAL将mdb转换gdb数据1 环境2 Nuget3 Code 1 环境 VisualStudio2022 .NET6 GDAL 3.8.5 2 Nuget 3 Code FeatureExtension.cs public static class FeatureExtension {[DllImport("gdal.dll", EntryPoint &…

中文+Midjourney,能描画出什么样的作品呢?保姆级上手指南送给你

中文Midjourney&#xff0c;能描画出什么样的作品呢&#xff1f; 中文版Midjourney来了&#xff01; 没有一点预热&#xff0c;Midjourney中文版&#xff08;以下简称 MJCN&#xff09;在本周开放了两次内测邀请&#xff0c;只需用 QQ 扫描邀请码&#xff0c;就可以在 QQ 频道…

VB列表框

移动是将列表框1中选中的数字移动到列表框2中。 全部是将列表框1中所有数字移动到列表框2中。 Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim i As Integer, a As IntegerRandomize()For i 0 To 9a Int(Rnd() * 90) …

51单片机STC8H8K64U通过RA8889/RA8876如何控制彩屏(源码下载)

【硬件部份】 一、硬件连接实物&#xff1a; STC8H系列单片机不需要外部晶振和外部复位&#xff0c;在相同的工作频率下&#xff0c;速度比传统的8051单片机要快12倍&#xff0c;具有高可靠抗干扰的优秀特性&#xff0c;与瑞佑的RA8889/RA8876控制芯片刚好可以完美搭配用于工…

Ubuntu24.04下安装docker,并pull ubuntu22.04,然后编译安装vpp

一、docker安装说明 解决官方源无法下载的问题 二、使用步骤 1.更新软件包索引 sudo apt update2.安装必要的软件包&#xff0c;以允许apt通过HTTPS使用仓库 sudo apt install apt-transport-https ca-certificates curl software-properties-common3.添加Docker的官方GPG…

【Chapter7】虚拟存储系统,计算机操作系统教程,第四版,左万利,王英

文章目录 [toc]零、前言一、外存资源管理1.1 外存空间划分1.2 外存空间分配1.2.1 空闲块链(慢)1.2.2 空闲块表(UNIX)1.2.3 字位映像图 1.3 进程与外存对应关系 二、虚拟页式存储系统2.1 基本原理2.2 内存页框分配策略2.3 外存块的分配策略2.4 页面调入时机2.5 置换算法2.5.1 最…

探索AI世界系列:俗说AI智能体

AI agent&#xff0c;翻译为中文就是AI智能体。 什么是AI智能体呢&#xff1f; 一&#xff0c;GPT对AI智能体的定义 AI智能体&#xff0c;即人工智能体&#xff08;Artificial Intelligence Agent&#xff09;&#xff0c;是具有自主性、学习能力和推理能力的计算机程序。 …

手把手教你使用kimi创建流程图【实践篇】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 引言 在昨日的文章中&#xff0c;我们介绍了如何使用Kimi生成论文中的流程图。今天&#xff0c;我们将更进一步&#xff0c;通过实践案例来展示Kimi在生成流程图方面的应用。这不仅将加…

基于 JuiceFS 构建高校 AI 存储方案:高并发、系统稳定、运维简单

中山大学的 iSEE 实验室&#xff08;Intelligence Science and System) Lab&#xff09;在进行深度学习任务时&#xff0c;需要处理大量小文件读取。在高并发读写场景下&#xff0c;原先使用的 NFS 性能较低&#xff0c;常在高峰期导致数据节点卡死。此外&#xff0c;NFS 系统的…

[SAP ABAP] 汇总内表数据

在加入新数据记录时&#xff0c;将非数值字段具有相同内容记录的数值字段汇总 语法格式 COLLECT <wa> INTO <itab>. <wa>&#xff1a;代表工作区 <itab>&#xff1a;代表内表 示例1 结果显示&#xff1a;

django restframework 多对多模型 —— python

模型 图书和作者是多对多关系 class Book(models.Model):book_namemodels.CharField(max_length40)pricemodels.DecimalField(max_digits4,decimal_places2)publishmodels.ForeignKey(to"Publish",on_deletemodels.CASCADE,related_name"publish")authorm…

ModuleNotFoundError: No module named ‘gdal‘

第一步检查gdal包是否正确安装&#xff1a; conda list 已经安装显示如下 若查找不到&#xff1a;请按照此说明步骤进行安装&#xff1a;ModuleNotFoundError: No module named ‘osgeo‘_modulenotfounderror: no module named osgeo-CSDN博客 第二步&#xff1a;检查是否可以…

VSCode运行前端项目-页面404

背景&#xff1a; 通过VSCode运行前端本地项目&#xff0c;运行成功后打开本地链接&#xff1a;http://1x.xxx.x.xxx:9803/ &#xff0c;发现打开的页面重定向到404&#xff1a;http//1xx.xxx.x.xxx:9803/404&#xff1b; 并且控制台出现&#xff1a;Failed to load resource: …

C语言 | 文件操作(下)【必收藏】

文件操作&#xff08;下&#xff09; 5、文件的顺序读写5.1 顺序读写函数介绍5.1.1 fputc与fgetc5.1.2 fputs与fgets5.1.3 fprintf与fscanf5.1.4 fread与fwrite 5.2 对比一组函数 6. 文件的随机读写6.1 fseek6.2 ftell6.3 rewind 7. 文件读取结束的判定7.1 被错误使用的feof 8.…

Redis 备份恢复以及数据迁移

昨晚老板突然在群里发了一张图片&#xff0c;说昨天才用的&#xff0c;怎么今天还要登录&#xff1f;相关人赶紧看看。 我心想让你登录就登录呗&#xff0c;哪来那么多事&#xff1f;本想洗洗睡了。老大突然微信问我说&#xff0c;是不是 Redis 出问题了&#xff1f;怎么用户…