1
1
package com.commandiron.compose_loading
2
2
3
- import androidx.compose.foundation.layout.Box
3
+ import androidx.compose.animation.core.*
4
+ import androidx.compose.foundation.Canvas
5
+ import androidx.compose.foundation.layout.size
4
6
import androidx.compose.material3.MaterialTheme
5
- import androidx.compose.material3.Text
6
7
import androidx.compose.runtime.Composable
7
- import androidx.compose.ui.Alignment
8
+ import androidx.compose.runtime.LaunchedEffect
9
+ import androidx.compose.runtime.remember
8
10
import androidx.compose.ui.Modifier
9
- import androidx.compose.ui.text.style.TextAlign
11
+ import androidx.compose.ui.draw.rotate
12
+ import androidx.compose.ui.geometry.Offset
13
+ import androidx.compose.ui.geometry.Size
14
+ import androidx.compose.ui.graphics.Color
15
+ import androidx.compose.ui.graphics.PathEffect
16
+ import androidx.compose.ui.graphics.drawscope.Stroke
17
+ import androidx.compose.ui.graphics.drawscope.rotate
18
+ import androidx.compose.ui.unit.Dp
19
+ import androidx.compose.ui.unit.dp
20
+ import com.commandiron.compose_loading.transition.EaseInOut
21
+ import com.commandiron.compose_loading.transition.fractionTransition
10
22
11
23
@Composable
12
24
fun InstaSpinner (
13
25
modifier : Modifier = Modifier ,
26
+ durationMillis : Int = 1000,
27
+ size : Dp = 40.dp,
28
+ color : Color = MaterialTheme .colorScheme.primary,
29
+ isRefreshing : Boolean = false
14
30
) {
31
+ val transition = rememberInfiniteTransition()
15
32
33
+ val alpha1 = transition.fractionTransition(
34
+ initialValue = 1f ,
35
+ targetValue = 0.1f ,
36
+ durationMillis = durationMillis,
37
+ easing = EaseInOut
38
+ )
39
+ val alpha2 = transition.fractionTransition(
40
+ initialValue = 1f ,
41
+ targetValue = 0.1f ,
42
+ durationMillis = durationMillis,
43
+ offsetMillis = durationMillis / 8 ,
44
+ easing = EaseInOut
45
+ )
46
+ val alpha3 = transition.fractionTransition(
47
+ initialValue = 1f ,
48
+ targetValue = 0.1f ,
49
+ durationMillis = durationMillis,
50
+ offsetMillis = durationMillis * 2 / 8 ,
51
+ easing = EaseInOut
52
+ )
53
+ val alpha4 = transition.fractionTransition(
54
+ initialValue = 1f ,
55
+ targetValue = 0.1f ,
56
+ durationMillis = durationMillis,
57
+ offsetMillis = durationMillis * 3 / 8 ,
58
+ easing = EaseInOut
59
+ )
60
+ val alpha5 = transition.fractionTransition(
61
+ initialValue = 1f ,
62
+ targetValue = 0.1f ,
63
+ durationMillis = durationMillis,
64
+ offsetMillis = durationMillis * 4 / 8 ,
65
+ easing = EaseInOut
66
+ )
67
+ val alpha6 = transition.fractionTransition(
68
+ initialValue = 1f ,
69
+ targetValue = 0.1f ,
70
+ durationMillis = durationMillis,
71
+ offsetMillis = durationMillis * 5 / 8 ,
72
+ easing = EaseInOut
73
+ )
74
+ val alpha7 = transition.fractionTransition(
75
+ initialValue = 1f ,
76
+ targetValue = 0.1f ,
77
+ durationMillis = durationMillis,
78
+ offsetMillis = durationMillis * 6 / 8 ,
79
+ easing = EaseInOut
80
+ )
81
+ val alpha8 = transition.fractionTransition(
82
+ initialValue = 1f ,
83
+ targetValue = 0.1f ,
84
+ durationMillis = durationMillis,
85
+ offsetMillis = durationMillis * 7 / 8 ,
86
+ easing = EaseInOut
87
+ )
16
88
89
+ val rotateDegree = remember {
90
+ Animatable (0f )
91
+ }
92
+
93
+ LaunchedEffect (key1 = isRefreshing){
94
+ if (isRefreshing){
95
+ rotateDegree.animateTo(
96
+ targetValue = 360f * 2 ,
97
+ animationSpec = infiniteRepeatable(
98
+ animation = tween(
99
+ durationMillis = durationMillis * 2 ,
100
+ easing = LinearEasing
101
+ )
102
+ )
103
+ )
104
+ }
105
+ }
17
106
18
- Box (
19
- modifier = modifier,
20
- contentAlignment = Alignment .Center
107
+ Canvas (
108
+ modifier = modifier
109
+ .size(size)
110
+ .rotate(rotateDegree.value)
21
111
){
22
- Text (
23
- text = " Insta Spinner" ,
24
- style = MaterialTheme .typography.labelSmall,
25
- textAlign = TextAlign .Center
26
- )
112
+ val rectSize = Size (width = this .size.width / 6 , height = this .size.height / 36 )
113
+ for (i in 0 until 8 ){
114
+ rotate(45f * i){
115
+ drawRect(
116
+ color = color.copy(
117
+ alpha = when (i){
118
+ 0 -> alpha1.value
119
+ 1 -> alpha2.value
120
+ 2 -> alpha3.value
121
+ 3 -> alpha4.value
122
+ 4 -> alpha5.value
123
+ 5 -> alpha6.value
124
+ 6 -> alpha7.value
125
+ 7 -> alpha8.value
126
+ else -> 1.0f
127
+ }
128
+ ),
129
+ topLeft = center + Offset (x = rectSize.width, y = 0f ),
130
+ size = rectSize,
131
+ style = Stroke (
132
+ width = rectSize.height * 2 ,
133
+ pathEffect = PathEffect .cornerPathEffect(rectSize.height)
134
+ )
135
+ )
136
+ }
137
+ }
27
138
}
139
+
140
+
141
+
142
+
28
143
}
0 commit comments