Skip to content

Commit d9c1ffc

Browse files
authored
Merge pull request #5 from kadubhumika/pr-2
Enhanced Splash Screen
2 parents 2ff21e5 + e4377e9 commit d9c1ffc

5 files changed

Lines changed: 128 additions & 3 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
android:allowBackup="true"
2121
android:dataExtractionRules="@xml/data_extraction_rules"
2222
android:fullBackupContent="@xml/backup_rules"
23-
android:icon="@mipmap/ic_launcher"
23+
android:icon="@drawable/logo"
2424
android:label="@string/app_name"
2525
android:name=".MyApplication"
26-
android:roundIcon="@mipmap/ic_launcher_round"
26+
android:roundIcon="@drawable/logo"
2727
android:supportsRtl="true"
2828
android:theme="@style/Theme.JetpackBoilerplate">
2929
<activity
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.cavin.material3expressivecatalog
2+
3+
import androidx.compose.animation.core.*
4+
import androidx.compose.foundation.Canvas
5+
import androidx.compose.foundation.background
6+
import androidx.compose.foundation.layout.*
7+
import androidx.compose.foundation.Image
8+
import androidx.compose.runtime.*
9+
import androidx.compose.ui.Alignment
10+
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.graphics.Color
12+
import androidx.compose.ui.graphics.graphicsLayer
13+
import androidx.compose.ui.res.painterResource
14+
import androidx.compose.ui.unit.dp
15+
import kotlinx.coroutines.delay
16+
import kotlin.random.Random
17+
18+
@Composable
19+
fun PremiumSplashScreen(onSplashFinished: () -> Unit) {
20+
val scale = remember { Animatable(0f) }
21+
22+
// Infinite transitions for logo animation
23+
val infiniteTransition = rememberInfiniteTransition()
24+
val rotation by infiniteTransition.animateFloat(
25+
initialValue = -10f,
26+
targetValue = 10f,
27+
animationSpec = infiniteRepeatable(
28+
tween(1000, easing = FastOutSlowInEasing),
29+
repeatMode = RepeatMode.Reverse
30+
)
31+
)
32+
val pulse by infiniteTransition.animateFloat(
33+
initialValue = 1f,
34+
targetValue = 1.1f,
35+
animationSpec = infiniteRepeatable(
36+
tween(800, easing = FastOutSlowInEasing),
37+
repeatMode = RepeatMode.Reverse
38+
)
39+
)
40+
val bounce by infiniteTransition.animateFloat(
41+
initialValue = 0f,
42+
targetValue = -20f,
43+
animationSpec = infiniteRepeatable(
44+
tween(600, easing = FastOutSlowInEasing),
45+
repeatMode = RepeatMode.Reverse
46+
)
47+
)
48+
49+
50+
val particleCount = 27
51+
val particles = remember {
52+
List(particleCount) {
53+
Particle(
54+
x = Random.nextFloat() * 800f,
55+
y = Random.nextFloat() * 1600f,
56+
radius = Random.nextFloat() * 4f + 2f,
57+
alpha = Random.nextFloat() * 0.5f + 0.3f
58+
)
59+
}
60+
}
61+
62+
// Animate logo scale in
63+
LaunchedEffect(Unit) {
64+
scale.animateTo(1f, tween(1000, easing = FastOutSlowInEasing))
65+
delay(2000) // splash duration
66+
onSplashFinished()
67+
}
68+
69+
Box(
70+
modifier = Modifier
71+
.fillMaxSize()
72+
.background(Color.Black),
73+
contentAlignment = Alignment.Center
74+
) {
75+
// Draw floating particles
76+
Canvas(modifier = Modifier.fillMaxSize()) {
77+
particles.forEach { p ->
78+
drawCircle(
79+
color = Color.White.copy(alpha = p.alpha),
80+
radius = p.radius,
81+
center = androidx.compose.ui.geometry.Offset(p.x, p.y)
82+
)
83+
}
84+
}
85+
86+
// Logo animation
87+
Image(
88+
painter = painterResource(id = R.drawable.logo),
89+
contentDescription = "App Logo",
90+
modifier = Modifier
91+
.size(200.dp)
92+
.graphicsLayer {
93+
scaleX = scale.value * pulse
94+
scaleY = scale.value * pulse
95+
translationY = bounce
96+
rotationZ = rotation
97+
shadowElevation = 20f
98+
}
99+
)
100+
}
101+
}
102+
103+
data class Particle(
104+
var x: Float,
105+
var y: Float,
106+
var radius: Float,
107+
var alpha: Float
108+
)

app/src/main/java/com/cavin/material3expressivecatalog/navigation/AppNavigation.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ import androidx.compose.animation.slideOutHorizontally
2020
import androidx.compose.animation.togetherWith
2121
import androidx.compose.runtime.Composable
2222
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
23+
import androidx.navigation.NavController
2324
import androidx.navigation3.runtime.entry
2425
import androidx.navigation3.runtime.entryProvider
2526
import androidx.navigation3.runtime.rememberNavBackStack
2627
import androidx.navigation3.runtime.rememberSavedStateNavEntryDecorator
2728
import androidx.navigation3.ui.NavDisplay
2829
import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator
30+
import com.cavin.material3expressivecatalog.PremiumSplashScreen
2931
import com.cavin.material3expressivecatalog.components.bottomappbar.bottomAppBarNavGraph
3032
import com.cavin.material3expressivecatalog.components.buttongroup.groupButtonNavGraph
3133
import com.cavin.material3expressivecatalog.components.buttons.buttonNavGraph
@@ -41,7 +43,8 @@ import com.cavin.material3expressivecatalog.home.HomeScreen
4143

4244
@Composable
4345
fun AppNavigation() {
44-
val backStack = rememberNavBackStack(Routes.HomeRoute)
46+
val backStack = rememberNavBackStack(Routes.SplashRoute)
47+
4548

4649
NavDisplay(
4750
entryDecorators =
@@ -70,6 +73,16 @@ fun AppNavigation() {
7073
},
7174
entryProvider =
7275
entryProvider {
76+
entry<Routes.SplashRoute> {
77+
PremiumSplashScreen(
78+
onSplashFinished = {
79+
backStack.removeLastOrNull()
80+
backStack.add(Routes.HomeRoute)
81+
}
82+
)
83+
}
84+
85+
7386
entry<Routes.HomeRoute> {
7487
HomeScreen(
7588
onNavigateToButtonGroup = { backStack.add(ButtonGroupRoutes.ListingRoute) },

app/src/main/java/com/cavin/material3expressivecatalog/navigation/AppRoutes.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ import kotlinx.serialization.Serializable
2121
sealed interface Routes {
2222
@Serializable
2323
data object HomeRoute : NavKey, Routes
24+
25+
@Serializable
26+
data object SplashRoute : NavKey, Routes
27+
2428
}
2529

2630
sealed interface ButtonGroupRoutes :

app/src/main/res/drawable/logo.jpg

21.9 KB
Loading

0 commit comments

Comments
 (0)