State Based Animations in Jetpack Compose
1. Animate Float As State
MainActivity
Copy this code →
package com.codingbihar.jetpackcomposeskill
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.ui.Modifier
import com.codingbihar.jetpackcomposeskill.ui.theme.JetpackComposeSkillTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
JetpackComposeSkillTheme {
StateBasedAnimation()
}
}
}
}
Animate Float as State Example
Used when you want to animate any property represented by a Float, such as opacity, scaling factors, or text size.
Copy this code →
package com.codingbihar.jetpackcomposeskill
import ...
@Composable
fun StateBasedAnimation(modifier: Modifier = Modifier) {
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
var floatValue by remember { mutableStateOf(false) }
var sp by remember { mutableStateOf("20") }
val size by animateFloatAsState(
targetValue = if (floatValue) 30f else 20f,
animationSpec = tween(durationMillis = 500),
label = ""
)
Box(modifier.clickable {
floatValue = !floatValue
sp = if (floatValue) 30.toString() else 20.toString()
}
) {
Text("State Based Animation ${sp}f", fontSize = size.sp)
}
}
}
Animate Color As State
Useful when you want to animate the color of a UI element.
Copy this code →
package com.codingbihar.jetpackcomposeskill
import ...
@Composable
fun StateBasedAnimation(modifier: Modifier = Modifier) {
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
var color by remember { mutableStateOf(false) }
// Animate the text color of the box
val textColor by animateColorAsState(
targetValue = if (color) Color.Green else Color.Red,
animationSpec = tween(durationMillis = 500),
label = ""
)
Box(modifier.clickable {
color = !color
}
) {
Text("State Based Animation", color = textColor)
}
}
}
Animate Dp As State
Commonly used to animate sizes, padding, margins, or dimensions.
Copy this code →
package com.codingbihar.jetpackcomposeskill
import ...
@Composable
fun StateBasedAnimation(modifier: Modifier = Modifier) {
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
var dpChange by remember { mutableStateOf(false) }
// Animate the background color of the box
val dpSize by animateDpAsState(
targetValue = if (dpExpanded) 400.dp else 200.dp,
animationSpec = tween(durationMillis = 500),
label = ""
)
Box(modifier.background(color = MaterialTheme.colorScheme.surfaceTint)
.size(dpSize)
.clickable {
dpChange = !dpChange
}
) {
Text("State Based Animation")
}
}
}
Animate Size As State
Useful for animating the size of elements like Box or other composables.
Copy this code →
package com.codingbihar.jetpackcomposeskill
import ...
@Composable
fun StateBasedAnimation(modifier: Modifier = Modifier) {
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
var dpChanged by remember { mutableStateOf(false) }
// Animate the background color of the box
val dpSize by animateDpAsState(
targetValue = if (dpExpanded) 400.dp else 200.dp,
animationSpec = tween(durationMillis = 500),
label = ""
)
Box(modifier.background(color = MaterialTheme.colorScheme.surfaceTint)
.size(dpSize)
.clickable {
dpChanged = !dpChanged
}
) {
Text("State Based Animation")
}
}
}
Animate Int As State
Useful for properties like integer-based sizes or indices.
Copy this code →
package com.codingbihar.jetpackcomposeskill
import ...
@Composable
fun StateBasedAnimation(modifier: Modifier = Modifier) {
Column(
Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
var sizeExpanded by remember { mutableStateOf(false) }
// Animate the size of the box using an Int value
val size by animateIntAsState(
targetValue = if (sizeExpanded) 400 else 200,
animationSpec = tween(durationMillis = 500),
label = ""
)
Box(modifier.background(color = MaterialTheme.colorScheme.surfaceTint)
.size(size.dp)
.clickable {
sizeExpanded = !sizeExpanded
}
) {
Text("State Based Animation")
}
}
}