安卓Compose实现鱼骨加载中效果

article/2025/6/7 3:05:25

安卓Compose实现鱼骨加载中效果

文章目录

  • 安卓Compose实现鱼骨加载中效果
    • 背景与简介
    • 适用场景
    • Compose骨架屏与传统View实现对比
    • Shimmer动画原理简介
    • 常见问题与优化建议
    • 参考资料

本文首发地址 https://h89.cn/archives/404.html

背景与简介

在移动应用开发中,加载中占位动画(Skeleton/骨架屏)能够有效提升用户体验,减少因数据延迟带来的焦虑感。鱼骨加载效果是一种常见的骨架屏动画,模拟内容结构,配合闪烁动画(Shimmer)让界面在数据加载时更具活力。Jetpack Compose 作为 Android 现代声明式UI框架,极大简化了骨架屏实现难度。

适用场景

  • 网络请求数据加载时的占位
  • 列表、卡片等内容结构明确的页面
  • 需要提升加载体验的场景

Compose骨架屏与传统View实现对比

  • 传统View实现骨架屏通常需要自定义View、手动绘制、管理动画,代码复杂且维护成本高。
  • Compose下,借助第三方库如 compose-shimmer,仅需简单修饰符组合即可实现灵活的骨架屏动画,代码更简洁、可读性更强。

Shimmer动画原理简介

Shimmer是一种通过渐变色块横向移动,模拟光影流动的动画效果。其本质是利用Canvas绘制渐变蒙版,并通过属性动画不断平移,实现闪烁流动的视觉效果。compose-shimmer库对这一过程进行了高度封装,开发者只需一行Modifier即可应用。

安卓如何实现如下图类似鱼骨加载中效果

我们需要使用compose-shimmer,添加依赖 (build.gradle)
implementation("com.valentinilk.shimmer:compose-shimmer:1.3.2")

最新的版本号可以参见 https://github.com/valentinilk/compose-shimmer

定义一个状态类 UiState 用于管理加载状态和数据:

data class UiState(val isLoading: Boolean = true, // 控制是否处于加载状态val data: List<Order> = emptyList() // 实际数据列表
) : IState

UiState 包含了 isLoading 布尔值来指示当前是否正在加载数据,以及 data 列表来存储实际的订单数据。当 isLoadingtrue 时,UI 将显示占位符(鱼骨效果),否则显示实际数据。

LazyColumn 中根据 UiStateisLoading 状态来显示不同的内容:

isLoadingtrue 时,我们渲染固定数量的占位符(这里是5个),并传入空的字符串作为占位内容。这些占位符将通过 OrderItemView 应用鱼骨加载效果。

isLoadingfalse 时,我们渲染实际的 viewState.data 中的数据。

LazyColumn(modifier = Modifier.padding(horizontal = 16.dp),verticalArrangement = Arrangement.spacedBy(16.dp)
) {if (viewState.isLoading) {items(5) { index ->// 传入空的字符占位OrderItemView(order = Order(type = "              ",status = "          ",time = "                                   ",startAddress = "                                        ",endAddress = "                                         "),viewState = viewState)}} else {items(viewState.data.size) { index ->OrderItemView(order = viewState.data[index],viewState = viewState)}}
}

OrderItemView 的部分参考实现如下:

OrderItemView 是一个可组合函数,它根据 viewState.isLoading 的值来决定是显示鱼骨加载效果还是实际的订单信息。关键在于 Modifier.shimmer() 的应用。


@Composable
fun OrderItemView(order: Order, viewState: UiState) {// 通过 viewState.isLoading 控制显示Card(modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp).then(if (viewState.isLoading) Modifier.shimmer() else Modifier),shape = RoundedCornerShape(16.dp),elevation = CardDefaults.cardElevation(4.dp),colors = CardDefaults.cardColors(containerColor = Color.White)) {// 部分实现, 通过 viewState.isLoading 控制显示Text(modifier = Modifier.background(color = if (viewState.isLoading) Color.LightGray else Color.Transparent,shape = RoundedCornerShape(2.dp)).then(if (viewState.isLoading) Modifier.shimmer() else Modifier), // shimmer 作用在 Text 上,使其背景闪烁text = order.type,style = MaterialTheme.typography.titleMedium)}
}

常见问题与优化建议

  • 闪烁效果不明显?
    • 请确保 Modifier.shimmer() 应用在 background 等绘制修饰符之后。
    • 可调整骨架色(如 Color.LightGray)和Shimmer参数(如高亮色、动画速度)增强对比度。
  • 骨架屏与内容跳变明显?
    • 建议骨架屏布局与实际内容布局保持一致,避免切换时界面抖动。
  • 性能影响?
    • compose-shimmer 性能较优,但大量骨架项或复杂动画时建议限制骨架数量,避免过度绘制。
  • 自定义骨架形状?
    • 可通过 backgroundshape 参数自定义圆角、椭圆等形状,灵活适配不同UI风格。

参考资料

  • compose-shimmer官方文档:https://github.com/valentinilk/compose-shimmer
  • Jetpack Compose官方文档:https://developer.android.com/jetpack/compose
  • 完整代码实现: https://gitee.com/chenjim/ArchitectureMVI 中 ShimmerScreen.kt

http://www.hkcw.cn/article/BhcNvcgvsg.shtml

相关文章

简单实现Ajax基础应用

Ajax不是一种技术&#xff0c;而是一个编程概念。HTML 和 CSS 可以组合使用来标记和设置信息样式。JavaScript 可以修改网页以动态显示&#xff0c;并允许用户与新信息进行交互。内置的 XMLHttpRequest 对象用于在网页上执行 Ajax&#xff0c;允许网站将内容加载到屏幕上而无需…

在Overleaf中使用IEEE模板

1、Overleaf网站 Log in to Overleaf - Overleaf, Online LaTeX Editor 2、左上角New project —— Journal articles 3、左上角back to all gallery items 4、搜索IEEE

BugKu Web渗透之源代码

启动场景&#xff0c;打开网页显示如下&#xff1a; 步骤一&#xff1a; 肯定是右键查看源代码。 如图&#xff1a; 感觉p1和p2都比较可疑。这样显示应该是url编码。 unescape&#xff1a; 对escape() 编码的字符串进行解码。 eval或者assert&#xff08;code&#xff09;的…

新版 Xcode 中 CoreData 模型编辑器显示拓扑图功能取消的替代方案

概述 何曾几时&#xff0c;小伙伴们在 Xcode 的 CoreData 模型编辑器里可以肆无忌惮的浏览数据库表结构的拓扑图&#xff0c;造福了我们这些秃头码农们&#xff0c;可惜这一功能现在已不复存在&#xff01; 那么&#xff0c;还有没有什么替代方案呢&#xff1f;本文由此应运而…

曹骏回应拒演短剧争议:专注长剧和电影

曹骏回应拒演短剧争议。曹骏回应拒演短剧争议,表示因不熟悉短剧领域,尊重经纪公司安排,专注长剧和电影。果然人红是非多,凭借《无忧渡》火起来的曹骏,居然被某编剧爆料称,拒绝了自己主创的短剧项目,而这个编剧还说自己是和曹骏相识十年。要我说啊,曹骏后援会的回应真挺…

卫健局回应女婴术后脑损伤 调查未明真相

近日,四川的徐女士反映,她五个多月大的孩子鱼鱼在四川大学华西第二医院锦江院区完成心脏手术后,从重症监护室转出时头部出现了一个创口。经检查,鱼鱼被诊断为脑出血和脑损伤,后续还伴有癫痫。当地卫健委介入调查但未能得出明确结论。5月29日,记者在事发医院看到已经一岁多…

数据安全管理进阶:81页 2024数据安全典型场景案例集【附全文阅读】

《2024 数据安全典型场景案例集》聚焦政务数据安全&#xff0c;覆盖数据细粒度治理、授权运营、接口安全、系统接入、批量数据共享、使用侧监管、风险监测、账号管控、第三方人员管理、密码应用等十大典型场景&#xff0c;剖析各场景风险并提供技术方案&#xff0c;如基于 AI 的…

数据加密标准(DES)解析及代码实现(java)

概述 数据加密标准&#xff08;Data Encryption Standard, DES&#xff09;是1977年由美国国家标准局&#xff08;NIST&#xff09;采纳的对称密钥加密算法&#xff0c;作为首个公开的联邦信息处理标准&#xff08;FIPS PUB 46&#xff09;。DES采用64位分组大小和56位有效密钥…

web程序设计期末复习-简答题

页面色彩搭配的基本原理 色彩的鲜明性。网页的色彩要鲜艳&#xff0c;容易引人注目。色彩的独特性。要有与众不同的色彩&#xff0c;使得大家对你的印象强烈。色彩的合适性。就是说色彩和你表达的内容气氛相合适。如用粉色体现女性站点的柔性。色彩的联想性。不同色彩会产生不…

pikachu靶场通关笔记11 XSS关卡07-XSS之关键字过滤绕过(三种方法渗透)

目录 一、源码分析 1、进入靶场 2、代码审计 3、攻击思路 二、渗透实战 1、探测过滤信息 2、注入Payload1 3、注入Payload2 4、注入Payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到安…

基于Java的OPCDA采集中间件

1.软件功能及技术特点简介&#xff1a; 软件功能及技术特点简介&#xff1a; OPCDA是基于Java语言开发的OPC client&#xff08;OPC客户端&#xff09;跨平台中间件软件&#xff0c;他支持OPC SERVER的OPC DA1.0/2.0/3.0。OPCDA实时采集数据&#xff08;包括实时数据、报警数…

centos挂载目录满但实际未满引发系统宕机

测试服务器应用系统突然挂了&#xff0c;经过排查发现是因为磁盘“满了”导致的&#xff0c;使用df -h查看磁盘使用情况/home目录使用率已经到了100%,但使用du -sh /home查看发现实际磁盘使用还不到1G&#xff0c;推测有进程正在写入或占用已删除的大文件&#xff08;Linux 系统…

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…

Redisson单机模式

redisson调用unlock的过程 Redisson 是一个基于 Redis 的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;框架&#xff0c;提供了分布式和可扩展的数据结构和服务。Redisson 的 unlock 方法用于释放锁。下面是 unlock 方法的调用过程&#xff1a; 获取锁的状…

软件测试环境搭建与测试流程

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1.软件测试环境搭建 思考&#xff1a; 在什么条件下做软件测试&#xff1f;怎么做软件测试&#xff1f; 1.1 搭建测试环境前 确定测试目的 功能测试&#xff…

Go语言学习-->从零开始搭建环境

Go语言学习–>从零开始搭建环境 1 开发环境 Go官网下载地址&#xff1a;https://golang.org/dl/ Go官方镜像站&#xff08;推荐&#xff09;&#xff1a;https://golang.google.cn/dl/ windos 平台下载&#xff1a; 我这里下载1.22稳定版 双击下载好的.msi文件 修改安装…

Mac 芯片系列 安装cocoapod 教程

安装声明&#xff1a; 本人是在搭梯子的环境下安装成功&#xff0c;前提是必须安装好安装homebrew环境。 1.检测rudy的源 2.查看源(目的:检测rudy的源) gem sources - l 3.移除源(目的:移除rudy自带的源) gem sources --remove https://rubygems.org/ 4.更换源(目的:替换成国…

idea不识别lombok---实体类报没有getter方法

介绍 本篇文章&#xff0c;主要讲idea引入lombok后&#xff0c;在实体类中加注解Data&#xff0c;在项目启动的时候&#xff0c;编译不通过&#xff0c;报错xxx.java没有getXxxx&#xff08;&#xff09;方法。 原因有以下几种 1. idea没有开启lombok插件 2. 使用idea-2023…

JavaWeb是什么?总结一下JavaWeb的体系

一&#xff1a;Maven 1.1 定义 不需要导入依赖&#xff0c;在配置文件描述配置信息&#xff0c;maven会自动导入 统一项目结构&#xff1a; 项目构建&#xff1a; 1.2 ideal集成 &#xff08;1&#xff09;maven配置 &#xff08;2&#xff09;创建maven项目 ‘ &#xff08;3&…

MEMCPY引发的非对齐访问

目录 前言背景代码直接运行的现象问题原因解决办法 前言 1&#xff0c;memcpy在keil中是伪装成函数的C语言关键字&#xff0c;有可能会被优化为字对齐形式__rt_memcpy_w 2&#xff0c;编译到memcpy位置的时候&#xff0c;编译器会检查地址类型&#xff0c;如果两个指针都是4字…