Android Compose中实现剪贴板操作的临时切换图标动画
实现剪贴板操作后的临时图标/颜色切换动画
你可以通过状态管理+LaunchedEffect+Compose动画API来实现这个需求,核心思路是用状态标记当前是否处于"已复制"状态,点击后触发状态变更并延迟重置,同时根据状态切换图标或颜色,配合动画实现平滑过渡。
以下是完整的实现代码:
val clipboardManager: ClipboardManager = LocalClipboardManager.current // 维护已复制状态,初始为未复制 var isCopied by remember { mutableStateOf(false) } // 颜色动画:根据状态切换图标颜色 val iconColor by animateColorAsState( targetValue = if (isCopied) Color.Green else Color.Gray, animationSpec = tween(durationMillis = 300) ) Icon( imageVector = if (isCopied) { // 已复制时显示的图标(比如对勾图标) ImageVector.vectorResource(id = R.drawable.ic_copied_success) } else { // 默认的复制图标 ImageVector.vectorResource(id = R.drawable.ic_copy_track_number) }, contentDescription = if (isCopied) "已复制" else "复制", tint = iconColor, modifier = Modifier .padding(start = 4.dp) .size(16.dp) .clickable { // 执行剪贴板复制操作 clipboardManager.setText(AnnotatedString(trackNumber)) // 切换到已复制状态 isCopied = true // 启动延迟任务,2秒后重置状态 LaunchedEffect(Unit) { delay(2000) isCopied = false } } )
关键部分说明:
- 状态管理:用
mutableStateOf和remember保存isCopied状态,Compose会根据状态变化自动重组UI。 - 延迟重置:点击后通过
LaunchedEffect启动协程,延迟2秒将isCopied改回false,实现临时效果。 - 平滑动画:使用
animateColorAsState实现图标的颜色渐变过渡,如果需要图标切换时的淡入淡出效果,可以用Crossfade组件包裹图标:
Crossfade(targetState = isCopied, animationSpec = tween(300)) { copied -> Icon( imageVector = if (copied) { ImageVector.vectorResource(id = R.drawable.ic_copied_success) } else { ImageVector.vectorResource(id = R.drawable.ic_copy_track_number) }, contentDescription = if (copied) "已复制" else "复制", tint = iconColor ) }
这样就能实现点击复制后,图标和颜色临时切换,2秒后自动恢复原状的效果。
内容的提问来源于stack exchange,提问作者Сергей Беляков
相关产品推荐
相关产品推荐

