使用animateFloatAsState设置时长无效,动画瞬间完成求助
问题原因及修复方案
你的动画瞬间完成是因为没有利用animateFloatAsState生成的渐变值,而是直接用isSelected的布尔值切换饱和度,跳过了动画过渡过程。
错误点分析
在创建ColorMatrix时,你传入的是if (isSelected) 1f else 0f——这个值会在点击时直接跳变,完全没用到动画生成的saturation渐变值,自然看不到过渡效果。
修复后的代码
// 保留动画状态,生成随时间渐变的饱和度值 val saturation by animateFloatAsState( targetValue = if (isSelected) 1f else 0f, animationSpec = tween(durationMillis = 1_000) ) // 用动画生成的saturation值创建ColorMatrix,确保渐变生效 val colorMatrix = remember(saturation) { ColorMatrix().apply { setToSaturation(saturation) } } // 使用修复后的colorMatrix Image( modifier = Modifier.size(24.dp), painter = painterResource(currencyCode.flag), contentDescription = null, colorFilter = ColorFilter.colorMatrix(colorMatrix) )
修复逻辑
animateFloatAsState会根据animationSpec的配置,在1000毫秒内逐步将saturation从当前值过渡到目标值。把这个渐变的saturation传给setToSaturation,ColorMatrix的饱和度就会跟着动画节奏变化,最终实现你想要的平滑过渡效果。
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

