Skip to content

Commit 04a7749

Browse files
committed
fix(compose): defer animation reads to draw/layout phase
Replace Modifier.scale() with graphicsLayer lambda to defer scale reads to the draw phase instead of triggering recomposition on every frame. Replace .background() with drawBehind for per-frame alpha changes in TypingIndicator dots. Use derivedStateOf to coalesce animated float reads in FlippableCard front/back switching.
1 parent 7a1c726 commit 04a7749

4 files changed

Lines changed: 24 additions & 11 deletions

File tree

apps/flipcash/features/bill-customization/src/main/kotlin/com/flipcash/app/bill/customization/components/HueScroller.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import androidx.compose.ui.draw.clip
2727
import androidx.compose.ui.draw.drawBehind
2828
import androidx.compose.ui.draw.drawWithCache
2929
import androidx.compose.ui.draw.drawWithContent
30-
import androidx.compose.ui.draw.scale
30+
import androidx.compose.ui.graphics.graphicsLayer
3131
import androidx.compose.ui.geometry.CornerRadius
3232
import androidx.compose.ui.geometry.Offset
3333
import androidx.compose.ui.geometry.Size
@@ -108,7 +108,10 @@ internal fun HueScroller(
108108
modifier = Modifier
109109
.align(Alignment.Center)
110110
.width(thumbWidth)
111-
.scale(scale),
111+
.graphicsLayer {
112+
scaleX = scale
113+
scaleY = scale
114+
},
112115
hsv = currentHsv,
113116
)
114117
}

apps/flipcash/features/bill-customization/src/main/kotlin/com/flipcash/app/bill/customization/components/SaturationBrightnessGrid.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import androidx.compose.ui.Alignment
2727
import androidx.compose.ui.Modifier
2828
import androidx.compose.ui.draw.clip
2929
import androidx.compose.ui.draw.drawBehind
30-
import androidx.compose.ui.draw.scale
30+
import androidx.compose.ui.graphics.graphicsLayer
3131
import androidx.compose.ui.geometry.CornerRadius
3232
import androidx.compose.ui.geometry.Offset
3333
import androidx.compose.ui.graphics.BlendMode
@@ -173,7 +173,10 @@ private fun BoxScope.Thumb(
173173
)
174174
}
175175
.size(thumbSize)
176-
.scale(scale)
176+
.graphicsLayer {
177+
scaleX = scale
178+
scaleY = scale
179+
}
177180
.align(Alignment.TopStart)
178181
) {
179182
Box(

ui/components/src/main/kotlin/com/getcode/ui/components/Flippable.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import androidx.compose.foundation.layout.BoxScope
88
import androidx.compose.foundation.layout.fillMaxSize
99
import androidx.compose.runtime.Composable
1010
import androidx.compose.runtime.State
11+
import androidx.compose.runtime.derivedStateOf
12+
import androidx.compose.runtime.getValue
13+
import androidx.compose.runtime.remember
1114
import androidx.compose.ui.Modifier
1215
import androidx.compose.ui.graphics.graphicsLayer
1316

@@ -59,6 +62,8 @@ fun FlippableCard(
5962
}
6063
}
6164

65+
val showFront by remember { derivedStateOf { rotation.value <= 90f } }
66+
6267
Box(
6368
modifier = modifier
6469
.graphicsLayer {
@@ -67,7 +72,7 @@ fun FlippableCard(
6772
}
6873
) {
6974
if (cardFace != CardFace.Neither) {
70-
if (rotation.value <= 90f) {
75+
if (showFront) {
7176
Box(
7277
modifier = Modifier
7378
.fillMaxSize()

ui/components/src/main/kotlin/com/getcode/ui/components/chat/TypingIndicator.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import androidx.compose.runtime.setValue
4141
import androidx.compose.ui.Alignment
4242
import androidx.compose.ui.Modifier
4343
import androidx.compose.ui.draw.clip
44-
import androidx.compose.ui.draw.scale
44+
import androidx.compose.ui.draw.drawBehind
4545
import androidx.compose.ui.graphics.Color
4646
import androidx.compose.ui.graphics.ColorFilter
4747
import androidx.compose.ui.graphics.CompositingStrategy
@@ -191,11 +191,13 @@ private fun TypingDots(
191191
Box(
192192
modifier = Modifier
193193
.size(CodeTheme.dimens.grid.x2)
194-
.scale(scale.value)
195-
.background(
196-
color = baseColor.copy(alpha = alpha.value),
197-
shape = CircleShape
198-
)
194+
.graphicsLayer {
195+
scaleX = scale.value
196+
scaleY = scale.value
197+
}
198+
.drawBehind {
199+
drawCircle(color = baseColor.copy(alpha = alpha.value))
200+
}
199201
)
200202
}
201203
}

0 commit comments

Comments
 (0)