├── .gitignore ├── .idea ├── .gitignore ├── AndroidProjectSystem.xml ├── compiler.xml ├── deploymentTargetSelector.xml ├── gradle.xml ├── kotlinc.xml ├── migrations.xml ├── misc.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── composeslideintext │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── composeslideintext │ │ │ ├── Composables.kt │ │ │ ├── MainActivity.kt │ │ │ └── ui │ │ │ └── theme │ │ │ ├── Color.kt │ │ │ ├── Theme.kt │ │ │ └── Type.kt │ └── res │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ └── ic_launcher_foreground.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 │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ ├── backup_rules.xml │ │ └── data_extraction_rules.xml │ └── test │ └── java │ └── com │ └── example │ └── composeslideintext │ └── ExampleUnitTest.kt ├── build.gradle.kts ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts /.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/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/AndroidProjectSystem.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/deploymentTargetSelector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | https://github.com/user-attachments/assets/ec34ebdb-ca44-4e84-9fb3-7f60cac65358 4 | 5 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.android.application) 3 | alias(libs.plugins.kotlin.android) 4 | alias(libs.plugins.kotlin.compose) 5 | } 6 | 7 | android { 8 | namespace = "com.example.composeslideintext" 9 | compileSdk = 35 10 | 11 | defaultConfig { 12 | applicationId = "com.example.composeslideintext" 13 | minSdk = 24 14 | targetSdk = 35 15 | versionCode = 1 16 | versionName = "1.0" 17 | 18 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" 19 | } 20 | 21 | buildTypes { 22 | release { 23 | isMinifyEnabled = false 24 | proguardFiles( 25 | getDefaultProguardFile("proguard-android-optimize.txt"), 26 | "proguard-rules.pro" 27 | ) 28 | } 29 | } 30 | compileOptions { 31 | sourceCompatibility = JavaVersion.VERSION_11 32 | targetCompatibility = JavaVersion.VERSION_11 33 | } 34 | kotlinOptions { 35 | jvmTarget = "11" 36 | } 37 | buildFeatures { 38 | compose = true 39 | } 40 | } 41 | 42 | dependencies { 43 | 44 | implementation(libs.androidx.core.ktx) 45 | implementation(libs.androidx.lifecycle.runtime.ktx) 46 | implementation(libs.androidx.activity.compose) 47 | implementation(platform(libs.androidx.compose.bom)) 48 | implementation(libs.androidx.ui) 49 | implementation(libs.androidx.ui.graphics) 50 | implementation(libs.androidx.ui.tooling.preview) 51 | implementation(libs.androidx.material3) 52 | testImplementation(libs.junit) 53 | androidTestImplementation(libs.androidx.junit) 54 | androidTestImplementation(libs.androidx.espresso.core) 55 | androidTestImplementation(platform(libs.androidx.compose.bom)) 56 | androidTestImplementation(libs.androidx.ui.test.junit4) 57 | debugImplementation(libs.androidx.ui.tooling) 58 | debugImplementation(libs.androidx.ui.test.manifest) 59 | } -------------------------------------------------------------------------------- /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/example/composeslideintext/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.example.composeslideintext 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.example.composeslideintext", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/composeslideintext/Composables.kt: -------------------------------------------------------------------------------- 1 | package com.example.composeslideintext 2 | 3 | import androidx.compose.animation.core.EaseOutQuad 4 | import androidx.compose.animation.core.animateFloatAsState 5 | import androidx.compose.animation.core.tween 6 | import androidx.compose.foundation.background 7 | import androidx.compose.foundation.layout.Box 8 | import androidx.compose.foundation.layout.Column 9 | import androidx.compose.foundation.layout.Spacer 10 | import androidx.compose.foundation.layout.fillMaxSize 11 | import androidx.compose.foundation.layout.fillMaxWidth 12 | import androidx.compose.foundation.layout.height 13 | import androidx.compose.foundation.layout.padding 14 | import androidx.compose.foundation.rememberScrollState 15 | import androidx.compose.foundation.shape.RoundedCornerShape 16 | import androidx.compose.foundation.verticalScroll 17 | import androidx.compose.material3.Button 18 | import androidx.compose.material3.ButtonDefaults 19 | import androidx.compose.material3.Card 20 | import androidx.compose.material3.CardDefaults 21 | import androidx.compose.material3.Slider 22 | import androidx.compose.material3.SliderDefaults 23 | import androidx.compose.material3.Text 24 | import androidx.compose.runtime.Composable 25 | import androidx.compose.runtime.LaunchedEffect 26 | import androidx.compose.runtime.getValue 27 | import androidx.compose.runtime.mutableFloatStateOf 28 | import androidx.compose.runtime.mutableStateOf 29 | import androidx.compose.runtime.remember 30 | import androidx.compose.runtime.setValue 31 | import androidx.compose.ui.Alignment 32 | import androidx.compose.ui.Modifier 33 | import androidx.compose.ui.draw.clip 34 | import androidx.compose.ui.graphics.Color 35 | import androidx.compose.ui.graphics.RectangleShape 36 | import androidx.compose.ui.graphics.graphicsLayer 37 | import androidx.compose.ui.platform.LocalConfiguration 38 | import androidx.compose.ui.platform.LocalDensity 39 | import androidx.compose.ui.text.AnnotatedString 40 | import androidx.compose.ui.text.SpanStyle 41 | import androidx.compose.ui.text.TextStyle 42 | import androidx.compose.ui.text.buildAnnotatedString 43 | import androidx.compose.ui.text.font.FontWeight 44 | import androidx.compose.ui.text.rememberTextMeasurer 45 | import androidx.compose.ui.text.style.TextAlign 46 | import androidx.compose.ui.text.withStyle 47 | import androidx.compose.ui.unit.Constraints 48 | import androidx.compose.ui.unit.TextUnit 49 | import androidx.compose.ui.unit.dp 50 | import androidx.compose.ui.unit.sp 51 | import kotlinx.coroutines.delay 52 | 53 | /** 54 | * Data class representing a single line of text with its index in the original text. 55 | * 56 | * @property index The zero-based index of this line in the original text. 57 | * @property text The content of this line as an AnnotatedString, preserving any styling from the original text. 58 | */ 59 | data class LineInfo( 60 | val index: Int, 61 | val text: AnnotatedString 62 | ) 63 | 64 | @Composable 65 | fun SlideInText(modifier: Modifier = Modifier) { 66 | var showAnimation by remember { mutableStateOf(false) } 67 | var delayPerLine by remember { mutableFloatStateOf(500f) } 68 | var animationDuration by remember { mutableFloatStateOf(500f) } 69 | 70 | val backgroundColor = Color(0xFFF8F9FA) 71 | val textColor = Color(0xFF212529) 72 | val accentColor = Color(0xFF6200EE) 73 | val buttonTextColor = Color.White 74 | val cardBackgroundColor = Color(0xFFFFFFFF) 75 | val sliderColor = Color(0xFF9575CD) 76 | 77 | Box( 78 | modifier = modifier 79 | .fillMaxSize() 80 | .background(backgroundColor), 81 | ) { 82 | Column( 83 | modifier = Modifier.fillMaxSize() 84 | ) { 85 | Box( 86 | modifier = Modifier 87 | .weight(1f, fill = false) 88 | .fillMaxWidth() 89 | .height(400.dp) 90 | .padding(16.dp), 91 | contentAlignment = Alignment.Center 92 | ) { 93 | if (showAnimation) { 94 | val sampleText = buildAnnotatedString { 95 | withStyle(SpanStyle(fontWeight = FontWeight.Bold, color = accentColor)) { 96 | append("LineByLineSlideInText") 97 | } 98 | append(" makes your text look more interesting and fun to read in Jetpack Compose apps. Instead of showing all your text at once, it shows one line at a time, with each new line sliding up from the bottom of the screen. This makes people more likely to read your text because it catches their eye and feels more alive than regular, static text. It's easy to add to any app and works with any kind of text you want to show. The smooth way the lines move in, one after another, creates a nice flow that helps people follow along with what you're saying. It's especially good for welcome screens, instructions, or any time you want people to pay extra attention to your words.") 99 | } 100 | 101 | Box( 102 | modifier = Modifier 103 | .fillMaxSize() 104 | .verticalScroll(rememberScrollState()), 105 | contentAlignment = Alignment.TopCenter 106 | ) { 107 | LineByLineSlideInText( 108 | text = sampleText, 109 | style = TextStyle( 110 | fontSize = 20.sp, 111 | lineHeight = 28.sp, 112 | color = textColor 113 | ), 114 | textAlign = TextAlign.Center, 115 | modifier = Modifier.padding(16.dp), 116 | animationDelayPerLine = delayPerLine.toLong(), 117 | animationDuration = animationDuration.toInt() 118 | ) 119 | } 120 | } 121 | } 122 | 123 | Spacer(modifier = Modifier.weight(1f)) 124 | 125 | Card( 126 | modifier = Modifier 127 | .fillMaxWidth() 128 | .padding(16.dp), 129 | colors = CardDefaults.cardColors(containerColor = cardBackgroundColor), 130 | elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), 131 | shape = RoundedCornerShape(16.dp) 132 | ) { 133 | Column( 134 | modifier = Modifier.padding(16.dp) 135 | ) { 136 | Text( 137 | text = "Animation Controls", 138 | fontWeight = FontWeight.Bold, 139 | fontSize = 18.sp, 140 | color = accentColor, 141 | modifier = Modifier.padding(bottom = 16.dp) 142 | ) 143 | 144 | // Delay slider 145 | Text( 146 | text = "Delay between lines: ${delayPerLine.toInt()} ms", 147 | fontSize = 14.sp, 148 | color = textColor 149 | ) 150 | Slider( 151 | value = delayPerLine, 152 | onValueChange = { delayPerLine = it }, 153 | valueRange = 100f..1000f, 154 | steps = 9, 155 | colors = SliderDefaults.colors( 156 | thumbColor = sliderColor, 157 | activeTrackColor = sliderColor, 158 | inactiveTrackColor = sliderColor.copy(alpha = 0.3f) 159 | ), 160 | modifier = Modifier.padding(bottom = 16.dp) 161 | ) 162 | 163 | Text( 164 | text = "Animation duration: ${animationDuration.toInt()} ms", 165 | fontSize = 14.sp, 166 | color = textColor 167 | ) 168 | Slider( 169 | value = animationDuration, 170 | onValueChange = { animationDuration = it }, 171 | valueRange = 100f..1000f, 172 | steps = 9, 173 | colors = SliderDefaults.colors( 174 | thumbColor = sliderColor, 175 | activeTrackColor = sliderColor, 176 | inactiveTrackColor = sliderColor.copy(alpha = 0.3f) 177 | ), 178 | modifier = Modifier.padding(bottom = 16.dp) 179 | ) 180 | 181 | Button( 182 | onClick = { showAnimation = !showAnimation }, 183 | colors = ButtonDefaults.buttonColors( 184 | containerColor = accentColor 185 | ), 186 | shape = RoundedCornerShape(12.dp), 187 | modifier = Modifier 188 | .fillMaxWidth() 189 | .height(56.dp) 190 | ) { 191 | Text( 192 | text = if (showAnimation) "Reset Animation" else "Start Animation", 193 | fontSize = 16.sp, 194 | color = buttonTextColor, 195 | fontWeight = FontWeight.Medium 196 | ) 197 | } 198 | } 199 | } 200 | } 201 | } 202 | } 203 | 204 | @Composable 205 | fun LineByLineSlideInText( 206 | text: AnnotatedString, 207 | style: TextStyle, 208 | textAlign: TextAlign, 209 | modifier: Modifier = Modifier, 210 | animationDelayPerLine: Long = 500L, 211 | animationDuration: Int = 500 212 | ) { 213 | val density = LocalDensity.current 214 | 215 | // Measure the text to split it into lines based on available width 216 | val textMeasurer = rememberTextMeasurer() 217 | val maxWidth = with(density) { 218 | (LocalConfiguration.current.screenWidthDp.dp - 32.dp).toPx() 219 | } 220 | 221 | // Calculate where line breaks occur in the text 222 | val textLayoutResult = textMeasurer.measure( 223 | text = text, 224 | style = style, 225 | maxLines = Int.MAX_VALUE, 226 | constraints = Constraints(maxWidth = maxWidth.toInt()) 227 | ) 228 | 229 | // Extract each line of text as a separate AnnotatedString 230 | val lineCount = textLayoutResult.lineCount 231 | val lineInfoList = (0 until lineCount).map { lineIndex -> 232 | val lineStart = textLayoutResult.getLineStart(lineIndex) 233 | val lineEnd = textLayoutResult.getLineEnd(lineIndex) 234 | val lineText = text.subSequence(lineStart, lineEnd) 235 | LineInfo(lineIndex, lineText) 236 | } 237 | 238 | // Get the line height from the text style 239 | val lineHeight: TextUnit = style.lineHeight 240 | 241 | // Create a column to hold all lines of text 242 | Column( 243 | modifier = modifier, 244 | horizontalAlignment = when (textAlign) { 245 | TextAlign.Center -> Alignment.CenterHorizontally 246 | TextAlign.End -> Alignment.End 247 | else -> Alignment.Start 248 | } 249 | ) { 250 | // For each line, create a clipped container and animate the text inside it 251 | lineInfoList.forEachIndexed { index, lineInfo -> 252 | // Calculate delay for this line based on its position 253 | val animationDelay = animationDelayPerLine * index 254 | 255 | // Track whether animation has started for this line 256 | var animationStarted by remember { mutableStateOf(false) } 257 | 258 | // Start animation after the calculated delay 259 | LaunchedEffect(key1 = "$animationDelayPerLine-$animationDuration") { 260 | animationStarted = false 261 | delay(animationDelay) 262 | animationStarted = true 263 | } 264 | 265 | // Animate the vertical offset of the text 266 | val animatedOffsetY by animateFloatAsState( 267 | // Start offscreen (at lineHeight) and animate to 0 268 | targetValue = if (animationStarted) 0f else lineHeight.value, 269 | animationSpec = tween( 270 | durationMillis = animationDuration, 271 | easing = EaseOutQuad // Smooth deceleration at the end 272 | ), 273 | label = "offsetY" 274 | ) 275 | 276 | // Clip box to hide text that hasn't fully translated into view 277 | Box( 278 | modifier = Modifier 279 | // Add a small padding to prevent clipping issues 280 | .height(with(density) { lineHeight.toDp() + 2.dp }) 281 | .fillMaxWidth() 282 | // Clip to ensure text outside the box is not visible 283 | .clip(RectangleShape) 284 | ) { 285 | // The actual text that will be animated 286 | Text( 287 | text = lineInfo.text, 288 | style = style, 289 | textAlign = textAlign, 290 | modifier = Modifier 291 | .fillMaxWidth() 292 | // Apply the animated translation 293 | .graphicsLayer { 294 | translationY = with(density) { 295 | animatedOffsetY.dp.toPx() 296 | } 297 | } 298 | ) 299 | } 300 | } 301 | } 302 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/composeslideintext/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.composeslideintext 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.compose.setContent 6 | import androidx.compose.foundation.layout.fillMaxSize 7 | import androidx.compose.foundation.layout.padding 8 | import androidx.compose.material3.Scaffold 9 | import androidx.compose.ui.Modifier 10 | import com.example.composeslideintext.ui.theme.ComposeSlideInTextTheme 11 | 12 | class MainActivity : ComponentActivity() { 13 | override fun onCreate(savedInstanceState: Bundle?) { 14 | super.onCreate(savedInstanceState) 15 | setContent { 16 | ComposeSlideInTextTheme { 17 | Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> 18 | SlideInText( 19 | modifier = Modifier 20 | .fillMaxSize() 21 | .padding(innerPadding) 22 | ) 23 | } 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/composeslideintext/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.example.composeslideintext.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple80 = Color(0xFFD0BCFF) 6 | val PurpleGrey80 = Color(0xFFCCC2DC) 7 | val Pink80 = Color(0xFFEFB8C8) 8 | 9 | val Purple40 = Color(0xFF6650a4) 10 | val PurpleGrey40 = Color(0xFF625b71) 11 | val Pink40 = Color(0xFF7D5260) -------------------------------------------------------------------------------- /app/src/main/java/com/example/composeslideintext/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.example.composeslideintext.ui.theme 2 | 3 | import android.app.Activity 4 | import android.os.Build 5 | import androidx.compose.foundation.isSystemInDarkTheme 6 | import androidx.compose.material3.MaterialTheme 7 | import androidx.compose.material3.darkColorScheme 8 | import androidx.compose.material3.dynamicDarkColorScheme 9 | import androidx.compose.material3.dynamicLightColorScheme 10 | import androidx.compose.material3.lightColorScheme 11 | import androidx.compose.runtime.Composable 12 | import androidx.compose.ui.platform.LocalContext 13 | 14 | private val DarkColorScheme = darkColorScheme( 15 | primary = Purple80, 16 | secondary = PurpleGrey80, 17 | tertiary = Pink80 18 | ) 19 | 20 | private val LightColorScheme = lightColorScheme( 21 | primary = Purple40, 22 | secondary = PurpleGrey40, 23 | tertiary = Pink40 24 | 25 | /* Other default colors to override 26 | background = Color(0xFFFFFBFE), 27 | surface = Color(0xFFFFFBFE), 28 | onPrimary = Color.White, 29 | onSecondary = Color.White, 30 | onTertiary = Color.White, 31 | onBackground = Color(0xFF1C1B1F), 32 | onSurface = Color(0xFF1C1B1F), 33 | */ 34 | ) 35 | 36 | @Composable 37 | fun ComposeSlideInTextTheme( 38 | darkTheme: Boolean = isSystemInDarkTheme(), 39 | // Dynamic color is available on Android 12+ 40 | dynamicColor: Boolean = true, 41 | content: @Composable () -> Unit 42 | ) { 43 | val colorScheme = when { 44 | dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { 45 | val context = LocalContext.current 46 | if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) 47 | } 48 | 49 | darkTheme -> DarkColorScheme 50 | else -> LightColorScheme 51 | } 52 | 53 | MaterialTheme( 54 | colorScheme = colorScheme, 55 | typography = Typography, 56 | content = content 57 | ) 58 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/composeslideintext/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.example.composeslideintext.ui.theme 2 | 3 | import androidx.compose.material3.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 | bodyLarge = TextStyle( 12 | fontFamily = FontFamily.Default, 13 | fontWeight = FontWeight.Normal, 14 | fontSize = 16.sp, 15 | lineHeight = 24.sp, 16 | letterSpacing = 0.5.sp 17 | ) 18 | /* Other default text styles to override 19 | titleLarge = TextStyle( 20 | fontFamily = FontFamily.Default, 21 | fontWeight = FontWeight.Normal, 22 | fontSize = 22.sp, 23 | lineHeight = 28.sp, 24 | letterSpacing = 0.sp 25 | ), 26 | labelSmall = TextStyle( 27 | fontFamily = FontFamily.Default, 28 | fontWeight = FontWeight.Medium, 29 | fontSize = 11.sp, 30 | lineHeight = 16.sp, 31 | letterSpacing = 0.5.sp 32 | ) 33 | */ 34 | ) -------------------------------------------------------------------------------- /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/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elec60/ComposeSlideInText/a331da6568999e0f47b28d26443dfc5270e059c3/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /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 | ComposeSlideInText 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |