Skip to content

Commit 13584f0

Browse files
add Mutex and Animatable sample
1 parent 1a657aa commit 13584f0

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.smarttoolfactory.tutorial1_1basics.chapter9_animation
2+
3+
import androidx.compose.animation.core.Animatable
4+
import androidx.compose.animation.core.LinearEasing
5+
import androidx.compose.animation.core.tween
6+
import androidx.compose.foundation.MutatorMutex
7+
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.fillMaxSize
9+
import androidx.compose.foundation.layout.fillMaxWidth
10+
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.material3.Button
12+
import androidx.compose.material3.Text
13+
import androidx.compose.runtime.Composable
14+
import androidx.compose.runtime.remember
15+
import androidx.compose.runtime.rememberCoroutineScope
16+
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.tooling.preview.Preview
18+
import androidx.compose.ui.unit.dp
19+
import androidx.compose.ui.unit.sp
20+
import kotlinx.coroutines.CancellationException
21+
import kotlinx.coroutines.launch
22+
import kotlinx.coroutines.sync.Mutex
23+
import kotlinx.coroutines.sync.withLock
24+
25+
@Preview
26+
@Composable
27+
fun CoroutinesTest() {
28+
29+
val mutex = remember {
30+
Mutex()
31+
}
32+
33+
val mutatorMutex = remember {
34+
MutatorMutex()
35+
}
36+
37+
38+
val scope = rememberCoroutineScope()
39+
40+
val animatable = remember {
41+
Animatable(0f)
42+
}
43+
44+
Column(
45+
modifier = Modifier.fillMaxSize().padding(24.dp)
46+
) {
47+
48+
Text(
49+
"Value: ${animatable.value.toInt()}", fontSize = 26.sp
50+
)
51+
52+
Button(
53+
modifier = Modifier.fillMaxWidth(),
54+
onClick = {
55+
scope.launch {
56+
mutex.withLock {
57+
animatable.snapTo(0f)
58+
try {
59+
animatable.animateTo(
60+
targetValue = 100f,
61+
animationSpec = tween(5000, easing = LinearEasing)
62+
)
63+
} catch (e: CancellationException) {
64+
println("Exception: ${e.message}")
65+
}
66+
}
67+
}
68+
}
69+
) {
70+
Text("Start with Mutex")
71+
}
72+
73+
Button(
74+
modifier = Modifier.fillMaxWidth(),
75+
onClick = {
76+
scope.launch {
77+
animatable.snapTo(0f)
78+
try {
79+
animatable.animateTo(
80+
targetValue = 100f,
81+
animationSpec = tween(5000, easing = LinearEasing)
82+
)
83+
} catch (e: CancellationException) {
84+
println("Exception: $e")
85+
}
86+
}
87+
}
88+
) {
89+
Text("Start")
90+
}
91+
92+
Button(
93+
modifier = Modifier.fillMaxWidth(),
94+
onClick = {
95+
96+
scope.launch {
97+
try {
98+
mutatorMutex.mutate {
99+
animatable.snapTo(0f)
100+
try {
101+
animatable.animateTo(
102+
targetValue = 100f,
103+
animationSpec = tween(5000, easing = LinearEasing)
104+
)
105+
} catch (e: CancellationException) {
106+
println("Exception: $e")
107+
}
108+
}
109+
}catch (e: Exception){
110+
println("MutatorMutexException: $e")
111+
}
112+
}
113+
}
114+
) {
115+
Text("Start with Mutex")
116+
}
117+
118+
}
119+
}

0 commit comments

Comments
 (0)