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

news2024/10/5 14:27:27

在这里插入图片描述

简介

在现代 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() {
                    @Override
                    public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                        return insets;
                    }
                });
        // 初始化其他成员变量
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // 计算视图的测量尺寸
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected 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);
    }

    @Override
    public 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() {


    @Override
    public 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() {
    @Override
    public 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.coloradmin.cn/o/1866835.html

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

相关文章

printf趣味代码,打印图案

文章目录 1.打印佛祖2.打印猫猫 (闪烁效果) 1.打印佛祖 #include <stdio.h>void budda_bless(){printf("///\n\ // _ooOoo_ //\n\ // o8888888o //\n\ // …

RK3568平台开发系列讲解(调试篇)分析内核调用的利器 ftrace

🚀返回专栏总目录 文章目录 一. 指定 ftrace 跟踪器二、设置要 trace 的函数三、ftrace 的开关四、查看 trace五、trace-cmd 的使用六、trace-cmd 的常用选项6.1、查看可以跟踪的事件6.2、跟踪特定进程的函数调用6.3、函数过滤6.4、限制跟踪深度6.5、追踪特定事件沉淀、分享、…

代码随想录-Day41

46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实…

C++学习/复习18----迭代器/反向迭代器及在list/vector中的应用、list与vector模拟实现复习

迭代器是一个对象&#xff0c;可以循环访问 C 标准库容器中的元素&#xff0c;并提供对各个元素的访问。 C 标准库容器全都提供迭代器&#xff0c;以便算法可以采用标准方式访问其元素&#xff0c;而不必考虑用于存储元素的容器类型。 一、反向迭代器类 基于普通迭代器构建反…

全面芯片外贸指南解密IC电子元器件商城网站搭建/制作/开发策略

电子元器件行业在数字化转型的大潮下正经历着前所未有的变革。传统销售渠道的局限性日益凸显&#xff0c;越来越多的企业和商家开始寻求线上突破&#xff0c;搭建自己的IC电子元器件商城网站成为提升市场竞争力的关键一步。本篇文章道合顺芯站点将详细阐述搭建IC电子元器件商城…

声场合成新方法:基于声波传播的框架

声场合成是指在房间内的麦克风阵列上&#xff0c;根据来自房间内其他位置的声源信号&#xff0c;合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务&#xff0c;因为它是一种成本效益高的方法&#xff0c;用于数据生成以替代真实的数据收集&#xff0c;后…

python 中面向对象编程:深入理解封装、继承和多态

在本章中&#xff0c;我们将深入探讨Python中的高级面向对象编程概念&#xff0c;包括封装、继承和多态。让我们开始吧&#xff01; 目录 面向对象简介类和实例属性和方法继承和多态 高级面向对象概念私有变量使用 property使用 __slots__类的特殊成员__doc____call____str____…

如何用Vue3打造一个交互式待办事项列表和日历

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 构建交互式卡片组件&#xff1a;Vue.js 实战 应用场景介绍 在现代 Web 应用程序中&#xff0c;卡片组件无处不在&#xff0c;它们提供了一种灵活且可扩展的方式来展示信息和启用交互。本文将指导你使用 Vue.j…

Qt 学习(一) addressbook

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

20240626(周三)AH股行情总结:沪指午后大反弹,港股震荡走高,AIGC、短剧概念走强,低价可转债触底反弹

内容提要 上证指数午后大反弹&#xff0c;创业板指涨近2%。港股震荡走高&#xff0c;恒生科技指数涨近1%。AIGC概念领涨&#xff0c;ST股、贵金属板块领跌。低价可转债集体大涨&#xff0c;广汇转债涨20%触发临停&#xff0c;广汇汽车今日上演地天板。 周三&#xff0c;A股午…

【BUG记录】条件查询没有查询结果 || MybatisPlus打印查询语句

结论 先说结论&#xff0c;查询没有结果&#xff0c;可能是数据库连接&#xff0c;数据问题之类&#xff0c;最有可能的根本原因是查询语句问题&#xff0c;需要想办法检查查询语句&#xff0c;使用mybatisPlus等自动生成查询语句的框架不能直接看语句&#xff0c;可以依靠日志…

Python期末模拟题库[python123题库]

期末模拟题库 一、单项选择题 1、下列关于Python语言的特点的说法中&#xff0c;错误的是()‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪…

高效运维:标准化与智能化的运维流程管理实践

高效运维&#xff1a;标准化与智能化的运维流程管理实践 在信息化建设日益深化的今天&#xff0c;运维流程管理已成为企业确保其信息系统稳定、高效运行的关键手段。通过系统化、标准化的运维流程管理&#xff0c;企业能够有效预防系统故障&#xff0c;提升服务质量&#xff0…

数据结构 —— 二叉树

1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它有着多分支&#xff0c;层次性的特点。 由于其形态类似于自然界中倒过来的数&#xff0c;所以我们将这种数据结构称为“树形结构” 注意&#xff1a; 树形结构中&#xff0c;子树之间不能有交集&#x…

一加全机型TWRP合集/橙狐recovery下载-20240603更新-支持一加12/Ace3V手机

TWRP是目前安卓平台的刷机神器&#xff0c;可快速刷写第三方ROM或官方系统&#xff0c;刷入TWRP之前需要解锁BL&#xff0c;目前已适配一加多个机型。ROM乐园小编20240603整理&#xff0c;涵盖一加1到一加Ace3V多机型专用TWRP文件&#xff0c;个人机型橙狐recovery适配相对完整…

MySQL 8 命令安装卸载教程

一、下载MySQL8 下载连接 MySQL :: Download MySQL Community Server 我下载的是当前最新版8.4 二、安装 1.解压 解压到需要安装的位置&#xff0c;例如我的位置&#xff1a; 2.创建配置文件 新建文本文档&#xff0c;复制下面配置文件&#xff08;注意修改路经&#xff09;…

DPDK使用make编译并运行示例程序

环境&#xff1a; VMware Workstation 16 Pro 16.2.4 虚拟机系统&#xff1a;Centos 8 DPDK版本&#xff1a;stable-20.11.10 下载源码后&#xff0c;使用meson和ninja编译完成、配置并挂载大页、内核和VFIO设置完成&#xff0c;在dpdk源码目录下的build/…

小程序 UI 风格,引人入胜

小程序 UI 风格&#xff0c;引人入胜

OceanBase 4.X-2F1A 仲裁高可用方案初探

作者&#xff1a;郑增权&#xff0c;爱可生 DBA 团队成员&#xff0c;OceanBase 和 MySQL 数据库技术爱好者。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文约 1500 字&#xff0c;预计阅读需要 5 分钟。 背景 对…

10个国内免费AI绘画网站汇总【2024最新】

迎战MidJourney和Stable Diffusion&#xff1a;10款国产AI绘画神器&#xff0c;让你轻松创作出超凡艺术品&#xff01;不论你是初学者还是资深艺术家&#xff0c;这些AI绘画平台都能帮你轻松入门。快来探索这些AI绘画网站&#xff0c;释放你的创意潜能&#xff01; 1、AI绘画创…