๐ Simple Animations - Android Jetpack Compose - Part 11 ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ ๐
setContent{
Box(modifier = Modifier
.size(200.dp)
.background(Color.Red),
contentAlignment = Alignment.Center) {
Button(onClick = { /*To DO*/ }) {
Text("Increase Size")
}
setContent{
var sizeState by remember { mutableStateOf(200.dp) }
Box(modifier = Modifier
.size(200.dp)
.background(Color.Red),
contentAlignment = Alignment.Center) {
Button(onClick = { /*To DO*/ }) {
Text("Increase Size")
+) ์๋ฌ๊ฐ ์์ ๊ฒฝ์ฐ, import ๋ถ๋ถ์์ import androidx.compose.runtime.remember
๋ฅผ import androidx.compose.runtime.*
๋ก ๋ณ๊ฒฝ
setContent{
var sizeState by remember { mutableStateOf(200.dp) }
Box(modifier = Modifier
.size(sizeState)
.background(Color.Red),
contentAlignment = Alignment.Center) {
Button(onClick = { sizeState += 50.dp }) {
Text("Increase Size")
}
-> ๋ฒํผ ํด๋ฆญ ์ sizeState๋ฅผ 50.dp ์ฉ ์ฆ๊ฐ โ ์์ง ์ ๋๋ฉ์ด์
X
setContent{
var sizeState by remember { mutableStateOf(200.dp) }
val size by animateDpAsState(targetValue = sizeState)
Box(modifier = Modifier
.size(size)
.background(Color.Red),
contentAlignment = Alignment.Center) {
Button(onClick = { sizeState += 50.dp }) {
Text("Increase Size")
}
animateDpAsState์ targetValue์ sizeState๋ฅผ ๋ฃ์ด์ค โ sizeState๋ฅผ ํฅํด์ ์ ๋๋ฉ์ดํธํ๊ธฐ๋ฅผ ์ํจ. โ ์ด๊ธฐ์ 200.dp์ธ๋ฐ ๊ฐ์ด ์ฆ๊ฐํ ๋, animateDpAsState ํจ์๊ฐ ๋ณํ๋ฅผ ์ธ์งํ๊ณ , sizeState๋ฅผ 250.dp๊ฐ ๋ ๋๊น์ง ๋ถ๋๋ฝ๊ฒ ์ฆ๊ฐ์ํด.
Box์ size๋ฅผ sizeState์์ size๋ก ๋ณ๊ฒฝ
duration๊ณผ delay ๋ฑ์ ์ ๋๋ฉ์ด์
์ ๋ฃ๊ณ ์ถ๋ค๋ฉด animateDpAsState์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ "animationSpec"์ ํ์ฉ
โ tween : easing curve๋ฅผ ์ฌ์ฉํด์ durationMillis
๋์ ์์ ๊ฐ๊ณผ ๋ ๊ฐ ๊ฐ์ ์ ๋๋ฉ์ด์
์ ์ฒ๋ฆฌ & delayMillis
๋ก ์ ๋๋ฉ์ด์
์์์ ์ฐ๊ธฐํ ์๋ ์์.
setContent{
var sizeState by remember { mutableStateOf(200.dp) }
val size by animateDpAsState(
targetValue = sizeState,
tween(
durationMillis = 3000,
delayMillis - 300,
easing = LinearOutSlowInEasing
)
Box(modifier = Modifier
.size(size)
.background(Color.Red),
contentAlignment = Alignment.Center) {
Button(onClick = { sizeState += 50.dp }) {
Text("Increase Size")
}
300milliseconds ๋ค์ ํฌ๊ธฐ๊ฐ 3์ด๊ฐ ์ปค์ง๋ ๊ฒ์ด ์ง์๋จ.
โ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฌ ๋ฒ ํด๋ฆญํ๋ฉด ์ ๋๋ฉ์ด์
์ ๋ฐฉํดํ๊ณ ์ ๋๋ฉ์ดํฐ๋ end value๊ฐ ๋จ.
โก spring : ์์ ๊ฐ๊ณผ ๋ ๊ฐ ์ฌ์ด์ ๋ฌผ๋ฆฌํ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ๋ง๋ค์ด์ค. dampingRatio & stiffness ์ค์ .
dampingRatio๋ ์คํ๋ง์ ํ์ฑ / stiffness๋ ์คํ๋ง์ด ์ข ๋ฃ ๊ฐ์ผ๋ก ์ด๋ํ๋ ์๋
setContent{
var sizeState by remember { mutableStateOf(200.dp) }
val size by animateDpAsState(
targetValue = sizeState,
spring(
Spring.DampingRatioHighBouncy
)
Box(modifier = Modifier
.size(size)
.background(Color.Red),
contentAlignment = Alignment.Center) {
Button(onClick = { sizeState += 50.dp }) {
Text("Increase Size")
}
DampingRatioHighBouncy๋ ๊ฐ์ฅ ์ผ ํ์ฑ
์ข
๋ฅ โ DampingRatioHighBouncy, DampingRatioMediumBouncy, DampingRatioLowBouncy,,, etc
โข keyframes : ์ ๋๋ฉ์ด์ ๊ธฐ๊ฐ์ ์ฌ๋ฌ ํ์์คํฌํ์์ ์ง์ ๋ ์ค๋ ์ท ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋๋ฉ์ด์ ์ ์ฒ๋ฆฌ. ์ธ์ ๋ ์ ๋๋ฉ์ด์ ๊ฐ์ ๋ ํคํ๋ ์ ๊ฐ ์ฌ์ด์ ๋ณด๊ฐ๋จ. ํคํ๋ ์๋ง๋ค easing์ ์ง์ ํ ์๋ ์์. ์ง์ ์๊ฐ์ ์ง์ ํ ์๋ ์๋๋ฐ ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์ค์ ์ด ์ฌ์ฉ๋จ.
setContent{
var sizeState by remember { mutableStateOf(200.dp) }
val size by animateDpAsState(
targetValue = sizeState,
keyframes{
durationMillis = 5000
sizeState at 0 with LinearEasing
sizeState * 1.5f at 1000 with FastOutLinearInEasing
sizeState * 2f at 5000
}
Box(modifier = Modifier
.size(size)
.background(Color.Red),
contentAlignment = Alignment.Center) {
Button(onClick = { sizeState += 50.dp }) {
Text("Increase Size")
}
์ฒ์ 1์ด๊น์ง ๋น ๋ฅธ easing, ๊ทธ ํ 5์ด๊น์ง
setContent{
var sizeState by remember { mutableStateOf(200.dp) }
val size by animateDpAsState(
targetValue = sizeState,
tween(
durationMillis = 1000
)
val infiniteTransition = rememberInfiniteTransition()
val color by infiniteTransition.animateFloat(
initialValue=Color.Red,
targetValue=Color.Green,
animationSpec=infinitRepeatable(
tween(durationMillis = 2000),
repeatMode = RepeatMode.Reverse
)
)
Box(modifier = Modifier
.size(size)
.background(color),
contentAlignment = Alignment.Center) {
Button(onClick = { sizeState += 50.dp }) {
Text("Increase Size")
}
InfiniteTransition๋ Transition๊ณผ ๊ฐ์ ํ์ ์ ๋๋ฉ์ด์ ์ด ํ๋ ์ด์ ํฌํจ๋์ง๋ง ์ปดํฌ์ง์ ์ ์์ํ๋ ์ฆ์ ์ ๋๋ฉ์ด์ ์ด ์์๋๋ฉฐ ์ญ์ ๋์ง ์๋ ํ ์ค๋จ๋์ง ์์. ํ์์ animatedColor, animatedFloat, animatedValue๊ฐ ์์.
repeatable : ์ง์ ๋ ๋ฐ๋ณต ํ์์ ๋๋ฌํ ๋๊น์ง tween ๋๋ keyframes ๊ฐ์ ๊ธฐ๊ฐ ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์คํ. repeatMode ๋งค๊ฐ๋ณ์๋ก ์ฒ์(RepeatMode.Restart)๋ถํฐ ๋๋ ๋(RepeatMode.Reverse)๋ถํฐ ์์ํ์ฌ ์ ๋๋ฉ์ด์ ์ ๋ฐ๋ณตํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํ ์ ์์.
infiniteRepeatable์ repeatable๊ณผ ์ ์ฌํ์ง๋ง ๋ฌดํ ๋ฐ๋ณต๋๋ ๊ฒ.
๋นจ๊ฐ์์ ์ด๋ก, ์ด๋ก์์ ๋นจ๊ฐ์ผ๋ก ๋ฐ๋. reverse๋ฅผ ํด์ ์๋ค๋ฆฌ ๊ฐ๋ค๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ. ๋ฐ์ค์ background๋ฅผ Color.Red์์ color๋ก ๋ฐ๊ฟ์ค.
์ฌ์ง ์ถ์ฒ : https://developer.android.com/jetpack/compose/animation
์ญ์ฌ ์ธ์์ด~~!