mirror of
https://github.com/pawelorzech/SunZones.git
synced 2026-01-29 19:54:26 +00:00
Refactor SunCard entrance animation to be shared
Moved the entrance animation logic from SunCard to MainScreen so that all cards share a single entrance animation instance. SunCard now receives entranceProgress as a parameter, simplifying its internal state and ensuring consistent animation timing across cards.
This commit is contained in:
parent
87ad810392
commit
34c842c2d5
2 changed files with 17 additions and 10 deletions
|
|
@ -1,5 +1,8 @@
|
|||
package com.sunzones.ui.main
|
||||
|
||||
import androidx.compose.animation.core.Animatable
|
||||
import androidx.compose.animation.core.FastOutSlowInEasing
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
|
|
@ -15,6 +18,7 @@ import androidx.compose.material3.Icon
|
|||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
|
|
@ -47,6 +51,15 @@ fun MainScreen(
|
|||
val uiState by viewModel.uiState.collectAsState()
|
||||
var showAddSheet by remember { mutableStateOf(false) }
|
||||
|
||||
// Entrance animation — runs once on screen load, shared by all cards
|
||||
val entranceProgress = remember { Animatable(0f) }
|
||||
LaunchedEffect(Unit) {
|
||||
entranceProgress.animateTo(
|
||||
targetValue = 1f,
|
||||
animationSpec = tween(durationMillis = 1200, easing = FastOutSlowInEasing)
|
||||
)
|
||||
}
|
||||
|
||||
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
|
||||
viewModel.refresh()
|
||||
}
|
||||
|
|
@ -110,7 +123,8 @@ fun MainScreen(
|
|||
onDelete = { viewModel.deleteLocation(location.id) },
|
||||
monthlyDaylight = uiState.yearlyDaylight[location.id],
|
||||
gradientColors = blendedGradient,
|
||||
pageOffset = pageOffset
|
||||
pageOffset = pageOffset,
|
||||
entranceProgress = entranceProgress.value
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ fun SunCard(
|
|||
monthlyDaylight: List<MonthDaylight>?,
|
||||
gradientColors: List<Color> = listOf(NightTop, NightBottom),
|
||||
pageOffset: Float = 0f,
|
||||
entranceProgress: Float = 1f,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
var showDeleteDialog by remember { mutableStateOf(false) }
|
||||
|
|
@ -99,15 +100,7 @@ fun SunCard(
|
|||
}
|
||||
}
|
||||
|
||||
// Step 5: Entrance animation
|
||||
val entranceProgress = remember { Animatable(0f) }
|
||||
LaunchedEffect(Unit) {
|
||||
entranceProgress.animateTo(
|
||||
targetValue = 1f,
|
||||
animationSpec = tween(durationMillis = 1200, easing = FastOutSlowInEasing)
|
||||
)
|
||||
}
|
||||
val entrance = entranceProgress.value
|
||||
val entrance = entranceProgress
|
||||
|
||||
// Step 4: Living sky ambient
|
||||
val ambientTransition = rememberInfiniteTransition(label = "ambient")
|
||||
|
|
|
|||
Loading…
Reference in a new issue