发布时间:2026/8/31 10:08:11
Compose 修饰符 - 阴影 官方介绍一、概念shadow() 会根据组件在屏幕位置呈现不同角度的光照阴影可以设置阴影高度更精细的自定义如阴影扩散或半径等属性使用另外两个。Modifier.shadow()高度阴影Modifier.dropShadow()外阴影Modifier.innerShadow()内阴影调用顺序在内容之上绘制在其它内容如背景之后调用。在内容之下绘制在其它内容如clip、background之前调用。在内容之上绘制在其它内容如背景之后调用。绘制效果从内容边界向内绘制阴影由低变高。如果内边距不够内容不是在阴影最高的那一圈内重叠部分会显得割裂。从内容边界向外绘制阴影但边界内也会纯色填充。如果内容背景有透明度重叠部分会颜色叠加效果。从内容边界向内绘制阴影。和内容的重叠部分会强覆盖。Row( modifier Modifier.width(500.dp).height(300.dp).background(Color.White), verticalAlignment Alignment.CenterVertically, horizontalArrangement Arrangement.SpaceEvenly ) { //【shadow】 Box( modifier Modifier .size(100.dp) //背景证明阴影是从边界向内绘制的 .background(Color.Blue.copy(alpha 0.1F)) .shadow( elevation 20.dp, shape RectangleShape ), contentAlignment Alignment.Center ) { Text( //边框证明内边距不够会割裂 modifier Modifier.border(1.dp,Color.Red), text shadow ) } //【dropShadow】 Box( modifier Modifier .size(100.dp) .dropShadow( shape RectangleShape, shadow Shadow( radius 5.dp, spread 5.dp, color Color.Red ) ) //背景有透明度呈现颜色叠加效果(紫色) .background(Color.Blue.copy(alpha 0.5F)), contentAlignment Alignment.Center ) { Text(dropShadow) } //【innerShadow】 Box( modifier Modifier .size(100.dp) //背景无透明度呈现强覆盖效果 .background(Color.Blue.copy(alpha 1F)) .innerShadow( shape RectangleShape, shadow Shadow( radius 5.dp, spread 5.dp, color Color.Red ) ), contentAlignment Alignment.Center ) { Text(innerShadow) } }二、参数说明Immutableclass Shadow private constructor(val radius: Dp, //模糊半径val spread: Dp, //扩散距离val offset: DpOffset, //阴影位置偏移color: Color,brush: Brush?,FloatRange(from 0.0, to 1.0) alpha: Float,val blendMode: BlendMode,)实现阴影传给 dropShadow() 或 innerShadow() 使用。2.1 shadow()fun Modifier.shadow(elevation: Dp, //阴影高度shape: Shape RectangleShape, //阴影形状clip: Boolean elevation 0.dp,ambientColor: Color DefaultShadowColor,spotColor: Color DefaultShadowColor,)2.2 dropShadow()fun Modifier.dropShadow(shape: Shape,shadow: Shadow): Modifier2.3 innerShadow()fun Modifier.innerShadow(shape: Shape,shadow: Shadow): Modifier三、结合动画使用动态阴影3.1 按压将 Shadow 对象的属性与动画结合当用户按下的时候阴影发生变化从而提供视觉反馈。Composable fun PressEffect() { Box( modifier Modifier.size(500.dp).background(Color.White), contentAlignment Alignment.Center ) { val interactionSource remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() val outerShadowColor by animateColorAsState( targetValue if (isPressed) Color.Transparent else Color.Blue, animationSpec tween(durationMillis 1000) ) val innerShadowColor by animateColorAsState( targetValue if (isPressed) Color.Red else Color.Transparent, animationSpec tween(durationMillis 1000) ) Box( modifier Modifier .size(100.dp) .clickable( interactionSource interactionSource, indication null ) { } .dropShadow( shape RoundedCornerShape(70.dp), shadow Shadow( radius 10.dp, spread 5.dp, color outerShadowColor, ) ) .background( color Color(0xFFFFFFFF), shape RoundedCornerShape(70.dp) ) .innerShadow( shape RoundedCornerShape(70.dp), shadow Shadow( radius 10.dp, spread 5.dp, color innerShadowColor, ) ), contentAlignment Alignment.Center ) { Text(按压效果) } } }3.2 呼吸实际生产不要用只适合做静态阴影官方有坑。dropShadow() 的参数变化在组合阶段读取导致 Modifier 重建触发每帧重组。示例代码中 Flowwhile(true) 也有隐患无限循环动画用 InfiniteTransition()。20260830。Composable fun BreathEffect() { Box( modifier Modifier.size(500.dp).background(Color.White), contentAlignment Alignment.Center ) { //每秒在 true/false 切换 val value by remember { flow { var defaultValue false while (true) { emit(defaultValue) defaultValue !defaultValue delay(1000) } } }.collectAsState(false) //添加动画 val animatedDp by animateDpAsState( targetValue if (value) 10.dp else 0.dp, animationSpec tween(1000) ) Box( modifier Modifier .size(100.dp) .dropShadow( shape RoundedCornerShape(70.dp), shadow Shadow( radius animatedDp, spread animatedDp, //笔刷使用扫描渐变 brush Brush.sweepGradient( listOf(Color.Red, Color.Cyan, Color.Yellow, Color.Green, Color.Blue) ) ) ) .clip(RoundedCornerShape(70.dp)) .background(Color(0xFF673AB7)), contentAlignment Alignment.Center ) { Text(呼吸效果) } } }3.3 拟态使用与背景色近似的颜色一个更亮一个更暗错位显示。作为对比右图移除按钮背景就是将两个阴影错位。Composable fun Nitai() { val shape RoundedCornerShape(30.dp) val bgColor Color(0xFFe0e0e0) val lightShadow Color(0xFFFFFFFF) val darkShadow Color(0xFFb1b1b1) val upperOffset (-10).dp val lowerOffset 10.dp val radius 15.dp val spread 0.dp Box( modifier Modifier .fillMaxSize() .background(bgColor) .wrapContentSize(Alignment.Center) .size(240.dp) .dropShadow( shape, shadow Shadow( radius radius, color lightShadow, spread spread, offset DpOffset(upperOffset, upperOffset) ), ) .dropShadow( shape, shadow Shadow( radius radius, color darkShadow, spread spread, offset DpOffset(lowerOffset, lowerOffset) ), ) .background(bgColor, shape) ) }

相关新闻

2026/8/31 10:03:11

408计算机网络强化复习:分层拆解法与高频题型全攻略

每年都有大量考 408 的同学,在计算机网络这门课上栽跟头。基础课听的时候感觉全懂了,什么 TCP 三次握手、四次挥手,什么 CSMA/CD,老师讲得明明白白;一到自己做题,选择题四个选项全是熟面孔,就是…

2026/8/31 10:23:13

llama.cpp AMD显卡快速部署完整指南

llama.cpp AMD显卡快速部署完整指南 【免费下载链接】llama.cpp LLM inference in C/C 项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp 你第一次运行 llama-cli 做本地推理,进度条却在加载模型前停住,日志里一行 "no GPU"…

2026/8/31 10:23:13

TensorFlow还是PyTorch?场景匹配比名气更重要

第一次接触深度学习的人,八成会卡在同一个问题前:TensorFlow 和 PyTorch,到底选哪个?社区里两派观点都有,有人看重 Keras 的简洁,有人强调动态图的灵活。我过去几年两个框架都分别用过,也见过很…

2026/8/31 10:23:13

三步跑通 Fooocus:本地部署 SDXL 文生图的完整流程

三步跑通 Fooocus:本地部署 SDXL 文生图的完整流程 【免费下载链接】Fooocus Focus on prompting and generating 项目地址: https://gitcode.com/GitHub_Trending/fo/Fooocus Fooocus 是一款离线运行的 Stable Diffusion XL 文生图软件,基于 Gra…

2026/8/31 10:23:13

stop-slop API集成进阶:参考文件按需加载的实现思路

stop-slop API集成进阶:参考文件按需加载的实现思路 【免费下载链接】stop-slop A skill file for removing AI tells from prose 项目地址: https://gitcode.com/GitHub_Trending/st/stop-slop stop-slop 是一个用于消除文本中 AI 写作痕迹(AI t…

2026/8/31 10:18:13

C语言项目:信息管理系统

说明:此项目主要是为了让我们能够训练C语言、数据结构、和熟悉一下项目管理 一、项目要求 (1)、技术要求点: 1、使用C语言(结构体、指针、数组等) 2、数据结构(双向循环链表,通用型容器) 3、算法(冒泡排序/快速排序、二分查找) (2)、其…

2026/8/31 1:05:20

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/31 2:14:20

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/31 1:41:28

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/31 0:07:32

STM32C5设备支持包(IAR DFP)安装指南与常见坑

上一阵子在IAR里折腾一块基于STM32C5系列的新板子,工程从STM32CubeMX导出来之后怎么都编译不过。报错信息很干脆:找不到设备描述文件。跟着错误路径去查,发现指向的是一个让我愣了一下的名字:STMicroelectronics.stm32c5xx.2.1.0.…

2026/8/31 0:07:32

STM32N657 SWO引脚矛盾:CubeMX显示PB3,数据手册为PB5

拿到STM32N657这颗料的第一天,我就撞上了一个让人原地懵圈的引脚矛盾:CubeMX里清清楚楚显示SWO在PB3,翻开数据手册的引脚说明表,却赫然写着PB5。对于一个靠SWO输出调试日志吃饭的人而言,这种"工具和手册打架"…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/31 9:19:59

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/31 6:53:02

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…