-
Notifications
You must be signed in to change notification settings - Fork 0
/
Modifier.kt
91 lines (85 loc) · 3.05 KB
/
Modifier.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.rskopyl.shake.ui.custom
import androidx.compose.animation.core.animateFloat
import androidx.compose.animation.core.infiniteRepeatable
import androidx.compose.animation.core.rememberInfiniteTransition
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.translate
import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntSize
fun Modifier.mirroring(
horizontalInset: Dp,
verticalInset: Dp = horizontalInset,
color: Color = Color.Unspecified
): Modifier = composed {
val rectColor = color.takeOrElse {
MaterialTheme.colorScheme.secondaryContainer
}
return@composed this
.padding(top = verticalInset, end = horizontalInset)
.drawBehind {
translate(
left = horizontalInset.toPx(),
top = -verticalInset.toPx()
) {
drawRect(color = rectColor)
}
}
}
fun Modifier.shimmer(
blinkColor: Color = Color.Unspecified,
containerColor: Color = Color.Transparent
): Modifier = composed {
val brushBlinkColor = blinkColor.takeOrElse {
MaterialTheme.colorScheme.secondary
}
var size by remember { mutableStateOf(IntSize.Zero) }
val blinkTransition = rememberInfiniteTransition()
val blinkStartOffsetX by blinkTransition.animateFloat(
initialValue = -2 * size.width.toFloat(),
targetValue = 2 * size.width.toFloat(),
animationSpec = infiniteRepeatable(
animation = tween(durationMillis = 1000)
)
)
return@composed this
.background(
brush = Brush.linearGradient(
colors = listOf(
containerColor,
brushBlinkColor,
containerColor
),
start = Offset(x = blinkStartOffsetX, y = 0f),
end = Offset(
x = blinkStartOffsetX + size.width,
y = size.height.toFloat()
)
)
)
.onGloballyPositioned { coordinates ->
size = coordinates.size
}
}
fun Modifier.shimmerOn(
condition: Boolean,
blinkColor: Color = Color.Unspecified,
containerColor: Color = Color.Transparent
): Modifier {
return if (condition) shimmer(blinkColor, containerColor)
else this
}