当前位置: 首页 > news >正文

不练不熟,不写就忘 之 compose 之 动画之 animateDpAsState动画练习

实现效果

1.控件尺寸动态变化
2. 布局间距 / 边距动画
3. 阴影 /elevation 动画
4. 动态边框宽度
5. 折叠 / 展开动画(部分尺寸)

按钮的点击效果

当控件的尺寸(宽 / 高、内外边距等)需要随状态变化时,使用 animateDpAsState 实现平滑过渡。


@Composable
fun AnimateDpTest(){val interactionSource = remember { MutableInteractionSource() }val isPress by interactionSource.collectIsPressedAsState()var isExpanded by remember { mutableStateOf(false) }val buttonSize by animateDpAsState(targetValue = if (isExpanded) 120.dp else 130.dp,animationSpec = tween(durationMillis = 300))LaunchedEffect(isPress) {Log.i("bl_zqq","isPress>>${isPress}")isExpanded = isPress}Button(onClick = {},modifier = Modifier.size(buttonSize),interactionSource = interactionSource) {Text("点击效果")}
}

请添加图片描述

布局间距 / 边距动画

布局中的间距(如 padding、margin)随状态变化时,用动画避免突兀的跳动。

var isSelected by remember { mutableStateOf(false) }val itemPadding by animateDpAsState(targetValue = if (isSelected) 16.dp else 8.dp)Box(modifier = Modifier.padding(itemPadding).background(Color.LightGray).clickable { isSelected = !isSelected }) {Text("列表项")}

请添加图片描述

阴影 /elevation 动画

控件的阴影大小(elevation)变化时,通过 animateDpAsState 实现平滑过渡(阴影大小与 Dp 相关)。

 var isSelected by remember { mutableStateOf(false) }val cardEvaluation by animateDpAsState(targetValue = if(isSelected) 10.dp else 100.dp,animationSpec = tween(durationMillis = 2000))val colorEvaluation by animateFloatAsState(targetValue = if(isSelected) 0f else 1f,animationSpec = tween(2000))val interactionSource = remember { MutableInteractionSource() }val isHover by interactionSource.collectIsPressedAsState()LaunchedEffect(isHover) {Log.i("bl_zqq","isHover>>${isHover}")isSelected = isHover}Card(onClick = {},modifier = Modifier.size(100.dp).shadow(elevation = cardEvaluation,ambientColor = Color.Blue.copy(alpha = colorEvaluation),spotColor = Color.Blue.copy(alpha = colorEvaluation)),interactionSource = interactionSource,){  }

这里做了2s的动画及颜色变化,更加清晰看到效果
请添加图片描述

动态边框宽度

控件边框(border)的宽度随状态变化时,用动画过渡更自然。

var isFocused by remember { mutableStateOf(false) }val borderWidth by animateDpAsState(targetValue = if (isFocused) 2.dp else 1.dp)OutlinedTextField(value = "",onValueChange = { },modifier = Modifier.border(width = borderWidth,color = if (isFocused) Color.Blue else Color.Gray).onFocusChanged(){isFocused = it.isFocused})

请添加图片描述

5. 折叠 / 展开动画(部分尺寸)

在折叠面板、抽屉等组件中,若只需要部分尺寸(如高度)动画,可单独对 Dp 值动画。

  var isExpanded by remember { mutableStateOf(false) }val contentHeight by animateDpAsState(targetValue = if (isExpanded) 200.dp else 0.dp)Column {Button(onClick = { isExpanded = !isExpanded }) {Text(if (isExpanded) "收起" else "展开")}Box(modifier = Modifier.height(contentHeight).fillMaxWidth().background(Color.LightGray))}

请添加图片描述

抽屉效果

@Composable
fun SlideDrawerDemo() {// 控制抽屉是否打开的状态var isDrawerOpen by remember { mutableStateOf(false) }// 抽屉宽度(固定为280dp)val drawerWidth = 280.dp// 动画控制抽屉的水平偏移量:关闭时偏移量为负的抽屉宽度(隐藏),打开时为0(显示)val drawerOffset by animateDpAsState(targetValue = if (isDrawerOpen) 0.dp else -drawerWidth,animationSpec = tween(durationMillis = 300), // 动画时长300mslabel = "抽屉偏移动画")Box(modifier = Modifier.fillMaxSize()) {// 主内容区域Box(modifier = Modifier.fillMaxSize().background(Color.LightGray),contentAlignment = Alignment.Center) {Button(onClick = { isDrawerOpen = !isDrawerOpen }) {Text(if (isDrawerOpen) "关闭抽屉" else "打开抽屉")}}// 抽屉组件(位于主内容上方)Box(modifier = Modifier.fillMaxHeight().width(drawerWidth)// 通过偏移控制显示/隐藏.offset(x = drawerOffset).background(Color.White)// 避免抽屉滑出时内容溢出显示.clipToBounds(),contentAlignment = Alignment.Center) {Text(text = "这是一个抽屉",fontSize = 20.sp,color = Color.Black)}}
}

请添加图片描述

http://www.dtcms.com/a/544912.html

相关文章:

  • HTML的布局—— DIV 与 SPAN
  • php网站搬家软件潍坊网络营销公司有哪些
  • Langchain中的消息
  • SQL是怎样执行的
  • 合肥网站建设卫来科技郑州高端建站
  • 景区网站建设策划书wordpress去掉rss订阅
  • HTTP中get请求和post请求的区别和联系
  • Rust 开发环境配置:IDE 选择与深度优化实践
  • PyTorch与TensorFlow GPU分布式训练策略详解
  • IDE热键冲突的解决
  • Docker篇1:docker-compose和docker.io区别
  • 如何将 TRAE IDE 的插件市场源切换至 VS Code 官方市场
  • 公司网站建设的请示有网站怎么做下载直链
  • 2025.10.29【服务器】|lftp 常见参数与使用方法详解(含上传下载实战)
  • 多模态大模型开发实战 -- OCR 基础入门
  • DeepSeek-OCR:下一代文档理解模型的技术跃迁
  • 神经网络之从向量空间角度理解PPMI矩阵
  • 神经网络之PPMI矩阵
  • 部署DeepSeek-OCR
  • 数学基础-线性代数(向量、矩阵、运算、范数、特征向量、特征值)
  • 【运维】ubuntu修改镜像源
  • 东莞营销型网站建设找火速昆山网站设计公司
  • 杭州网站定制开发谁帮58同城做的网站吗
  • (1)起始之章:Qt初印象
  • 【Java】理解Java内存中堆栈机制与装箱拆箱的底层逻辑
  • 车辆管理|校园车辆信息|基于SprinBoot+vue的校园车辆管理系统(源码+数据库+文档)
  • JAVA课程第八次实验课程主要知识点示例
  • SpringBoot3集成MyBatisPlus版本问题
  • JVM的内存区域划分、类加载机制与垃圾回收原理
  • 三种方法解开——力扣3370.仅含置位位的最小整数