Compose 动画 (一) : animateXxxAsState 实现放大/缩小/渐变等效果

1. 前言

动画Android Compose中很重要的一块内容。利用Compose可以简洁地定义动画,我们可以轻松快速地通过动画让应用变得生动有趣。
本文会介绍如何定义一个最简单的Compose动画,从而实现Compose动画。

2 定义一个Box

首先,我们先定义一个Box,给它背景设置为蓝色

Box(Modifier.size(50.dp).background(Color.Blue)) {

}

显示效果如下
在这里插入图片描述
这样我们就把方块显示出来了,接下来怎么让方块放大呢 ?

3 定义一个Size替换50.dp

定义一个变量size,将50.dp替换为变量size。可以看到size是用mutableStateOf进行包裹的,mutableStateOf的返回值是一个MutableState,通过它就可以实现值变化后,Compose界面自动改变。

var size by remember {
    mutableStateOf(50.dp)
}

Box(
    Modifier
        .size(size)
        .background(Color.Blue)) {

}

4 设置点击事件改变size大小

通过点击事件,改变变量Size的值,这样Compose会自动改变界面。

var size by remember {
    mutableStateOf(50.dp)
}

Box(
    Modifier
        .size(size)
        .background(Color.Blue)
        .clickable {
            size = if (size == 50.dp) 100.dp else 50.dp
        }) {

}

我们运行项目,点击后效果如下
在这里插入图片描述

5 实现动画效果

刚才实现的效果是瞬间变大的,我们希望动画是有一个渐变的过程的。
这就需要使用到animateDpAsState()

我们将

var size by remember {
    mutableStateOf(50.dp)
}

替换为

var big by remember {
    mutableStateOf(false)
}
val size by animateDpAsState(if (big) 100.dp else 50.dp)

然后,在点击事件的时候,去改变big的值

Box(
    Modifier
        .size(size)
        .background(Color.Blue)
        .clickable {
            big = !big
        }) {

}

运行程序,来看下效果
在这里插入图片描述

6 更多的animateXxxAsState

Compose中不光有animateDpAsState(),还有

  • animateValueAsState : 其他的animateXxxAsState内部都是调用的这个
  • animateRectAsState : 参数是传的一个Rect对象,Rect(left,top,right,bottom)
  • animateIntAsState : 参数传的是Int
  • animateDpAsState : 参数传的是Dp
  • animateFloatAsState : 参数传的是Float
  • animateColorAsState : 参数传的是Color
  • animateOffsetAsState : 参数传的是OffsetOffset(x,y)xyFloat类型
  • animateIntOffsetAsState : 参数传的是IntOffsetIntOffset(x,y)xyInt类型
  • animateSizeAsState : 参数传的是SizeSize(width,height)widthheightFloat类型
  • animateIntSizeAsState : 参数传的是IntSizeIntSize(width,height)widthheightInt类型

7 animateColorAsState

我们以animateColorAsState为例,来试一下

var big by remember {
    mutableStateOf(false)
}
val size by animateDpAsState(if (big) 100.dp else 50.dp)
val color by animateColorAsState(targetValue = if (big) Color.Red else Color.Blue)

Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) {
    Box(
        Modifier
            .size(size)
            .background(color)
            .clickable {
                big = !big
            }) {

    }
}

可以看到,使用方式是一样的,效果如下所示
在这里插入图片描述

8 小结

到这儿,我们就已经学会如何使用animateXXAsState来实现Compose动画了。
但想必大家还有疑问

  • 为什么animateDpAsState要用val ? 而mutableStateOf就用var ?
  • MutableStateState有什么区别 ?
  • 为什么animateDpAsState不需要包remember ?
  • 为什么把mutableStateOf替换为animateDpAsState,就可以实现动画渐变的效果 ?

这些我们都将在下一篇文章里介绍。

9. Compose 动画系列

Compose 动画系列
Compose 动画 (一) : animateXxxAsState 实现放大/缩小/渐变等效果
Compose 动画 (二) : 为什么animateDpAsState要用val ? MutableState和State有什么区别 ?
Compose 动画 (三) : AnimatedVisibility 从入门到深入
Compose 动画 (四) : AnimatedVisibility 各种入场和出场动画效果
Compose 动画 (五) : animateContentSize / animateEnterExit / Crossfade / AnimatedContent
Compose 动画 (六) : 使用Transition管理多个动画,实现动画预览
Compose 动画 (七) : 高可定制性的动画 Animatable
Compose 动画 (八) : Compose中的动画差值器 AnimationSpec
快速入门Compose动画 :
一个小时入门Compose动画

本文为氦客在CSDN上独家发布
地址 : https://blog.csdn.net/EthanCo/article/details

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值