返回

Compose:花式Loading秀一秀,点燃你的创作激情!

Android

花式Loading,点燃你的灵感之火

在 Compose 的世界里,Loading 动画不再是枯燥的等待,而是创意与灵感的舞台。从简单的圆形进度条到复杂的自定义动画,你可以自由发挥,让你的 App 焕发独一无二的光彩。

入门指南:从零开始打造你的第一个 Loading 动画

如果你还是 Compose 新手,不要担心!我们将从最基础的知识开始,一步步教你如何使用 Compose 创建自己的 Loading 动画。

Step 1:引入必要的库

import androidx.compose.animation.core.*
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.size
import androidx.compose.material.CircularProgressIndicator
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp

Step 2:定义动画参数

val infiniteTransition = rememberInfiniteTransition()
val animatedFloat = infiniteTransition.animateFloat(
    initialValue = 0f,
    targetValue = 360f,
    animationSpec = infiniteRepeatable(
        animation = tween(durationMillis = 1000),
        repeatMode = RepeatMode.Restart
    )
)

Step 3:构建动画

Box(modifier = Modifier.size(100.dp), contentAlignment = Alignment.Center) {
    CircularProgressIndicator(
        modifier = Modifier.size(80.dp),
        color = Color.Blue,
        strokeWidth = 4.dp
    )

    Canvas(modifier = Modifier.size(100.dp)) {
        val center = Offset(size.width / 2f, size.height / 2f)
        val radius = 40f

        drawCircle(
            color = Color.Red,
            radius = radius,
            center = center,
            alpha = animatedFloat.value / 360f
        )
    }
}

Step 4:运行并欣赏你的杰作

恭喜你,你已经成功创建了自己的第一个 Compose Loading 动画!现在,你可以尽情探索 Compose 的动画世界,创造更多令人惊叹的动效。

探索更多高级技巧

如果你已经掌握了基础知识,不妨挑战一下自己,学习一些更高级的 Compose 动画技巧。

  • 使用路径动画创建复杂动画
  • 使用关键帧动画创建流畅的动画
  • 使用物理动画模拟真实世界的运动

实践出真知:从示例代码中汲取灵感

为了帮助你更好地理解 Compose 的动画机制,我们准备了丰富的示例代码供你参考学习。

示例一:多彩跳动球动画

@Composable
fun JumpingBalls() {
    val infiniteTransition = rememberInfiniteTransition()
    val animatedFloat1 = infiniteTransition.animateFloat(
        initialValue = 0f,
        targetValue = 1f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 1000),
            repeatMode = RepeatMode.Restart
        )
    )
    val animatedFloat2 = infiniteTransition.animateFloat(
        initialValue = 0.5f,
        targetValue = 1.5f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 1000),
            repeatMode = RepeatMode.Restart
        )
    )
    val animatedFloat3 = infiniteTransition.animateFloat(
        initialValue = 1f,
        targetValue = 2f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 1000),
            repeatMode = RepeatMode.Restart
        )
    )

    Box(modifier = Modifier.size(200.dp), contentAlignment = Alignment.Center) {
        Canvas(modifier = Modifier.size(200.dp)) {
            drawCircle(color = Color.Red, radius = 20.dp, center = Offset(100.dp, 100.dp * animatedFloat1.value))
            drawCircle(color = Color.Green, radius = 20.dp, center = Offset(150.dp, 100.dp * animatedFloat2.value))
            drawCircle(color = Color.Blue, radius = 20.dp, center = Offset(200.dp, 100.dp * animatedFloat3.value))
        }
    }
}

示例二:旋转齿轮动画

@Composable
fun RotatingGears() {
    val infiniteTransition = rememberInfiniteTransition()
    val animatedFloat1 = infiniteTransition.animateFloat(
        initialValue = 0f,
        targetValue = 360f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 1000),
            repeatMode = RepeatMode.Restart
        )
    )
    val animatedFloat2 = infiniteTransition.animateFloat(
        initialValue = 0f,
        targetValue = -360f,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis = 1000),
            repeatMode = RepeatMode.Restart
        )
    )

    Box(modifier = Modifier.size(200.dp), contentAlignment = Alignment.Center) {
        Canvas(modifier = Modifier.size(200.dp)) {
            drawArc(
                color = Color.Red,
                startAngle = 0f,
                sweepAngle = 120f,
                useCenter = false,
                size = Size(100.dp, 100.dp),
                topLeft = Offset(50.dp, 50.dp),
                rotation = animatedFloat1.value
            )
            drawArc(
                color = Color.Green,
                startAngle = 120f,
                sweepAngle = 120f,
                useCenter = false,
                size = Size(100.dp, 100.dp),
                topLeft = Offset(50.dp, 50.dp),
                rotation = animatedFloat1.value
            )
            drawArc(
                color = Color.Blue,
                startAngle = 240f,
                sweepAngle = 120f,
                useCenter = false,
                size = Size(100.dp, 100.dp),
                topLeft = Offset(50.dp, 50.dp),
                rotation = animatedFloat1.value
            )

            drawArc(
                color = Color.Red,
                startAngle = 0f,
                sweepAngle = 120f,
                useCenter = false,
                size = Size(100.dp, 100.dp),
                topLeft = Offset(150.dp, 50.dp),
                rotation = animatedFloat2.value
            )
            drawArc(
                color = Color.Green,
                startAngle = 120f,
                sweepAngle = 120f,
                useCenter = false,
                size = Size(100.dp, 100.dp),
                topLeft = Offset(150.dp, 50.dp),
                rotation = animatedFloat2.value
            )
            drawArc(
                color = Color.Blue,
                startAngle = 240f,
                sweepAngle = 120f,
                useCenter = false,
                size = Size(100.dp, 100.dp),
                topLeft = Offset(150.dp, 50.dp),
                rotation = animatedFloat2.value
            )
        }
    }
}

结语:释放你的想象力,惊艳世界!

现在,你已经掌握了 Compose 动画的精髓,可以尽情挥洒你的想象力,创造出令人惊叹的 Loading 动画。不要局限于现有的示例,大胆尝试,突破自我,相信你会创造出更加震撼人心的作品!

常见问题解答

  1. 什么是 Compose 动画?
    Compose 动画是一种使用 Jetpack Compose 创建动态界面的强大机制。它允许你创建流畅、可定制的动画,以增强用户体验和应用程序外观。

  2. 如何创建简单的 Loading 动画?
    你可以使用 CircularProgressIndicator 组件创建简单的圆形 Loading 动画。或者,你可以使用 Canvas 组件创建自定义形状和效果的更复杂的动画。

  3. 如何控制动画的持续时间和重复?
    你可以使用 tween 函数来控制动画的持续时间和重复行为。该函数允许你指定动画的开始值、结束值和插值器,从而控制动画的平滑度。