├── .github └── workflows │ └── single-workflow.yml ├── .gitignore ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── ericampire │ │ └── mobile │ │ └── demo │ │ └── compose │ │ └── animation │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── ericampire │ │ │ └── mobile │ │ │ └── demo │ │ │ └── compose │ │ │ └── animation │ │ │ ├── MainActivity.kt │ │ │ └── ui │ │ │ ├── theme │ │ │ ├── Color.kt │ │ │ ├── Shape.kt │ │ │ ├── Theme.kt │ │ │ └── Type.kt │ │ │ └── view │ │ │ └── Animation.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ └── themes.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── com │ └── ericampire │ └── mobile │ └── demo │ └── compose │ └── animation │ └── ExampleUnitTest.kt ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.github/workflows/single-workflow.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI 4 | 5 | # Controls when the workflow will run 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the master branch 8 | push: 9 | branches: [ master ] 10 | pull_request: 11 | branches: [ master ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | # This workflow contains a single job called "build" 19 | build: 20 | # The type of runner that the job will run on 21 | runs-on: ubuntu-latest 22 | 23 | # Steps represent a sequence of tasks that will be executed as part of the job 24 | steps: 25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 26 | - uses: actions/checkout@v2 27 | 28 | # Runs a single command using the runners shell 29 | - name: Run a one-line script 30 | run: echo Hello, world! 31 | 32 | # Runs a set of commands using the runners shell 33 | - name: Run a multi-line script 34 | run: | 35 | echo Add other actions to build, 36 | echo test, and deploy your project. 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | /.idea/ 17 | /.gradle/ 18 | /build/ 19 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | id("kotlin-android") 4 | } 5 | 6 | android { 7 | compileSdk = 30 8 | buildToolsVersion = "30.0.3" 9 | 10 | defaultConfig { 11 | applicationId = "com.ericampire.mobile.demo.compose.animation" 12 | minSdk = 21 13 | targetSdk = 30 14 | versionCode = 1 15 | versionName = "1.0" 16 | 17 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" 18 | vectorDrawables { 19 | useSupportLibrary = true 20 | } 21 | } 22 | 23 | buildTypes { 24 | release { 25 | isMinifyEnabled = false 26 | proguardFiles( 27 | getDefaultProguardFile("proguard-android-optimize.txt"), 28 | "proguard-rules.pro" 29 | ) 30 | } 31 | } 32 | compileOptions { 33 | sourceCompatibility = JavaVersion.VERSION_1_8 34 | targetCompatibility = JavaVersion.VERSION_1_8 35 | } 36 | kotlinOptions { 37 | jvmTarget = "1.8" 38 | } 39 | buildFeatures { 40 | compose = true 41 | } 42 | composeOptions { 43 | kotlinCompilerExtensionVersion = rootProject.extra["composeVersion"] as String 44 | } 45 | } 46 | 47 | dependencies { 48 | implementation("androidx.core:core-ktx:1.3.2") 49 | implementation("androidx.appcompat:appcompat:1.2.0") 50 | implementation("com.google.android.material:material:1.3.0") 51 | 52 | implementation("androidx.compose.ui:ui:${rootProject.extra["composeVersion"]}") 53 | implementation("androidx.compose.material:material:${rootProject.extra["composeVersion"]}") 54 | implementation("androidx.compose.ui:ui-tooling:${rootProject.extra["composeVersion"]}") 55 | 56 | implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-alpha01") 57 | implementation("androidx.activity:activity-compose:1.3.0-alpha07") 58 | 59 | testImplementation("junit:junit:4.13.2") 60 | 61 | androidTestImplementation("androidx.test.ext:junit:1.1.2") 62 | androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0") 63 | androidTestImplementation("androidx.compose.ui:ui-test-junit4:${rootProject.extra["composeVersion"]}") 64 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/ericampire/mobile/demo/compose/animation/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.ericampire.mobile.demo.compose.animation 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.ericampire.mobile.demo.compose.animation", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/ericampire/mobile/demo/compose/animation/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.ericampire.mobile.demo.compose.animation 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.compose.setContent 6 | import androidx.compose.material.MaterialTheme 7 | import androidx.compose.material.Surface 8 | import androidx.compose.material.Text 9 | import androidx.compose.runtime.Composable 10 | import androidx.compose.ui.tooling.preview.Preview 11 | import com.ericampire.mobile.demo.compose.animation.ui.theme.ComposeAnimationTheme 12 | import com.ericampire.mobile.demo.compose.animation.ui.view.LoadingAnimation 13 | 14 | class MainActivity : ComponentActivity() { 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setContent { 18 | ComposeAnimationTheme { 19 | LoadingAnimation() 20 | } 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ericampire/mobile/demo/compose/animation/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.ericampire.mobile.demo.compose.animation.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple200 = Color(0xFFBB86FC) 6 | val Purple500 = Color(0xFF6200EE) 7 | val Purple700 = Color(0xFF3700B3) 8 | val Teal200 = Color(0xFF03DAC5) 9 | val WhiteTransparent = Color(0x80FFFFFF) -------------------------------------------------------------------------------- /app/src/main/java/com/ericampire/mobile/demo/compose/animation/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.ericampire.mobile.demo.compose.animation.ui.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes( 8 | small = RoundedCornerShape(4.dp), 9 | medium = RoundedCornerShape(4.dp), 10 | large = RoundedCornerShape(0.dp) 11 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/ericampire/mobile/demo/compose/animation/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.ericampire.mobile.demo.compose.animation.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | import androidx.compose.foundation.isSystemInDarkTheme 5 | import androidx.compose.material.MaterialTheme 6 | import androidx.compose.material.darkColors 7 | import androidx.compose.material.lightColors 8 | import androidx.compose.runtime.Composable 9 | 10 | private val DarkColorPalette = darkColors( 11 | primary = Purple200, 12 | primaryVariant = Purple700, 13 | secondary = Teal200 14 | ) 15 | 16 | private val LightColorPalette = lightColors( 17 | primary = Purple500, 18 | primaryVariant = Purple700, 19 | secondary = Teal200, 20 | background = Purple500, 21 | surface = Color.White, 22 | onPrimary = Color.White, 23 | onSecondary = Color.Black, 24 | onBackground = Color.Black, 25 | onSurface = Color.Black, 26 | ) 27 | 28 | @Composable 29 | fun ComposeAnimationTheme( 30 | darkTheme: Boolean = isSystemInDarkTheme(), 31 | content: @Composable() () -> Unit 32 | ) { 33 | val colors = if (darkTheme) { 34 | DarkColorPalette 35 | } else { 36 | LightColorPalette 37 | } 38 | 39 | MaterialTheme( 40 | colors = colors, 41 | typography = Typography, 42 | shapes = Shapes, 43 | content = content 44 | ) 45 | } -------------------------------------------------------------------------------- /app/src/main/java/com/ericampire/mobile/demo/compose/animation/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.ericampire.mobile.demo.compose.animation.ui.theme 2 | 3 | import androidx.compose.material.Typography 4 | import androidx.compose.ui.text.TextStyle 5 | import androidx.compose.ui.text.font.FontFamily 6 | import androidx.compose.ui.text.font.FontWeight 7 | import androidx.compose.ui.unit.sp 8 | 9 | // Set of Material typography styles to start with 10 | val Typography = Typography( 11 | body1 = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 16.sp 15 | ), 16 | button = TextStyle( 17 | fontFamily = FontFamily.Default, 18 | fontWeight = FontWeight.W500, 19 | fontSize = 14.sp 20 | ), 21 | caption = TextStyle( 22 | fontFamily = FontFamily.Default, 23 | fontWeight = FontWeight.Normal, 24 | fontSize = 12.sp 25 | ) 26 | 27 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/ericampire/mobile/demo/compose/animation/ui/view/Animation.kt: -------------------------------------------------------------------------------- 1 | package com.ericampire.mobile.demo.compose.animation.ui.view 2 | 3 | import androidx.compose.animation.core.* 4 | import androidx.compose.foundation.Canvas 5 | import androidx.compose.foundation.layout.Box 6 | import androidx.compose.foundation.layout.fillMaxSize 7 | import androidx.compose.foundation.layout.size 8 | import androidx.compose.foundation.shape.CircleShape 9 | import androidx.compose.material.Surface 10 | import androidx.compose.runtime.* 11 | import androidx.compose.ui.Alignment 12 | import androidx.compose.ui.Modifier 13 | import androidx.compose.ui.graphics.Color 14 | import androidx.compose.ui.graphics.Path 15 | import androidx.compose.ui.graphics.drawscope.Stroke 16 | import androidx.compose.ui.graphics.drawscope.translate 17 | import androidx.compose.ui.platform.LocalConfiguration 18 | import androidx.compose.ui.platform.LocalDensity 19 | import androidx.compose.ui.unit.dp 20 | import com.ericampire.mobile.demo.compose.animation.ui.theme.Purple500 21 | import com.ericampire.mobile.demo.compose.animation.ui.theme.WhiteTransparent 22 | 23 | @Composable 24 | fun LoadingAnimation() { 25 | var currentRotation by remember { mutableStateOf(0f) } 26 | val rotation = remember { Animatable(currentRotation) } 27 | 28 | LaunchedEffect(true) { 29 | rotation.animateTo( 30 | targetValue = currentRotation + 360f, 31 | animationSpec = infiniteRepeatable( 32 | animation = tween(2000, easing = LinearEasing), 33 | repeatMode = RepeatMode.Restart 34 | ), 35 | block = { 36 | currentRotation = value 37 | } 38 | ) 39 | } 40 | 41 | Surface( 42 | modifier = Modifier.fillMaxSize(), 43 | color = Purple500, 44 | content = { 45 | Box( 46 | modifier = Modifier.fillMaxSize(), 47 | contentAlignment = Alignment.Center, 48 | content = { 49 | Canvas(modifier = Modifier.size(300.dp)) { 50 | drawCircle( 51 | style = Stroke(width = 20f), 52 | color = WhiteTransparent 53 | ) 54 | 55 | drawArc( 56 | color = Color.White, 57 | startAngle = rotation.value, 58 | sweepAngle = 30f, 59 | useCenter = false, 60 | style = Stroke(width = 20f), 61 | ) 62 | } 63 | 64 | Surface( 65 | modifier = Modifier.size(278.dp), 66 | shape = CircleShape, 67 | color = Color.Transparent, 68 | content = { 69 | WaveView( 70 | timeSpec = 10000, 71 | init = true, 72 | initValue = 1f, 73 | targetValue = 0f 74 | ) 75 | WaveView( 76 | timeSpec = 10000, 77 | init = true, 78 | initValue = 0f, 79 | targetValue = 1f, 80 | waveWidth = 800 81 | ) 82 | WaveView( 83 | timeSpec = 4000, 84 | init = true, 85 | initValue = 0f, 86 | targetValue = 1f, 87 | waveWidth = 700, 88 | dxTimeSpec = 2000 89 | ) 90 | } 91 | ) 92 | } 93 | ) 94 | } 95 | ) 96 | } 97 | 98 | @Composable 99 | fun WaveView( 100 | modifier: Modifier = Modifier, 101 | timeSpec: Long, 102 | initValue: Float, 103 | targetValue: Float, 104 | init: Boolean, 105 | waveWidth: Int = 600, 106 | dxTimeSpec: Int = 4000 107 | ) { 108 | 109 | val deltaXAnim = rememberInfiniteTransition() 110 | val dx by deltaXAnim.animateFloat( 111 | initialValue = initValue, 112 | targetValue = targetValue, 113 | animationSpec = infiniteRepeatable( 114 | animation = tween(dxTimeSpec, easing = LinearEasing) 115 | ) 116 | ) 117 | 118 | val dy by deltaXAnim.animateFloat( 119 | initialValue = 300f, 120 | targetValue = 0f, 121 | animationSpec = infiniteRepeatable( 122 | animation = tween(5000, easing = LinearEasing), 123 | repeatMode = RepeatMode.Reverse 124 | ) 125 | ) 126 | 127 | val screenWidthPx = with(LocalDensity.current) { 128 | (LocalConfiguration.current.screenHeightDp * density) - 150.dp.toPx() 129 | } 130 | val animTranslate by animateFloatAsState( 131 | targetValue = if (init) 0f else screenWidthPx, 132 | animationSpec = TweenSpec(if (init) 0 else timeSpec.toInt(), easing = LinearEasing) 133 | ) 134 | 135 | val waveHeight by animateFloatAsState( 136 | targetValue = if (init) 125f else 0f, 137 | animationSpec = TweenSpec(if (init) 0 else timeSpec.toInt(), easing = LinearEasing) 138 | ) 139 | 140 | val path = Path() 141 | 142 | Canvas( 143 | modifier = modifier.fillMaxSize(), 144 | onDraw = { 145 | translate(top = animTranslate) { 146 | drawPath(path = path, color = WhiteTransparent) 147 | path.reset() 148 | val halfWaveWidth = waveWidth / 2 149 | path.moveTo(-waveWidth + (waveWidth * dx), dy.dp.toPx()) 150 | 151 | for (i in -waveWidth..(size.width.toInt() + waveWidth) step waveWidth) { 152 | path.relativeQuadraticBezierTo( 153 | halfWaveWidth.toFloat() / 2, 154 | -waveHeight, 155 | halfWaveWidth.toFloat(), 156 | 0f 157 | ) 158 | path.relativeQuadraticBezierTo( 159 | halfWaveWidth.toFloat() / 2, 160 | waveHeight, 161 | halfWaveWidth.toFloat(), 162 | 0f 163 | ) 164 | } 165 | 166 | path.lineTo(size.width, size.height) 167 | path.lineTo(0f, size.height) 168 | path.close() 169 | } 170 | } 171 | ) 172 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eric-ampire/compose-animation/ac5d88aa16b32217fdbcf4d2d7c501fa4aedbb6e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Compose Animation 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 21 | 22 |