├── .gitignore ├── .idea ├── .gitignore └── kotlinc.xml ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── overlappinglist │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── overlappinglist │ │ │ ├── DogsAdapter.kt │ │ │ ├── MainActivity.kt │ │ │ ├── OverlappingDecoration.kt │ │ │ └── ui │ │ │ └── theme │ │ │ ├── Color.kt │ │ │ ├── Theme.kt │ │ │ └── Type.kt │ └── res │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── img.png │ │ ├── img_1.png │ │ ├── img_10.png │ │ ├── img_11.png │ │ ├── img_12.png │ │ ├── img_2.png │ │ ├── img_3.png │ │ ├── img_4.png │ │ ├── img_5.png │ │ ├── img_6.png │ │ ├── img_7.png │ │ ├── img_8.png │ │ └── img_9.png │ │ ├── layout │ │ ├── activity_main.xml │ │ └── item_list.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 │ └── overlappinglist │ └── ExampleUnitTest.kt ├── build.gradle.kts ├── gradle.properties ├── gradle └── 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/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Overlapping Lists: Custom Composable Vs RecyclerView 2 | ![demo-ezgif com-optimize](https://github.com/raystatic/OverlappingLists/assets/31301266/aced9f06-7ce3-4035-8f28-ef187de4184c) 3 | 4 | ## Overview 5 | This repository contains two sets of code examples: 6 | 1. **RecyclerView Implementation**: Contains the code for achieving overlapping behavior in a horizontal list using RecyclerView and a custom item decoration class. 7 | 2. **Jetpack Compose Implementation**: Includes the code for creating overlapping lists using Jetpack Compose, specifically using a custom composable function called `OverlappingRow`. 8 | 9 | ## Blog Post 10 | The blog post associated with this repository delves into the intricacies of implementing overlapping lists in Android applications. It explores the user experience implications and compares the RecyclerView and Jetpack Compose approaches. You can read the full blog post [here](https://rahul9650ray.medium.com/overlapping-lists-custom-composable-vs-recyclerview-9d0655c5a20e). 11 | 12 | ## Usage 13 | Feel free to explore the code examples provided in this repository. You can use them as a reference for implementing overlapping lists in your Android projects. Make sure to follow the instructions provided in the blog post for a detailed explanation of each implementation. 14 | 15 | ## Connect 16 | Let's connect on LinkedIn and Twitter to stay updated with the latest developments in Android development and user interface design. 17 | 18 | - LinkedIn: [@raystatic](https://www.linkedin.com/in/raystatic/) 19 | - Twitter: [@raystatic_](https://twitter.com/raystatic_) 20 | 21 | ## Source Code 22 | You can find the complete source code for the implementations discussed in the blog post in this repository. Clone or download the repository to access the code examples. 23 | 24 | Repository Link: [https://github.com/raystatic/OverlappingLists](https://github.com/raystatic/OverlappingLists) 25 | 26 | If you have any questions or suggestions, feel free to open an issue or reach out via LinkedIn or Twitter. Happy coding! 🚀 27 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | id("org.jetbrains.kotlin.android") 4 | } 5 | 6 | android { 7 | namespace = "com.example.overlappinglist" 8 | compileSdk = 34 9 | 10 | defaultConfig { 11 | applicationId = "com.example.overlappinglist" 12 | minSdk = 24 13 | targetSdk = 34 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 | viewBinding = true 42 | } 43 | composeOptions { 44 | kotlinCompilerExtensionVersion = "1.4.3" 45 | } 46 | packaging { 47 | resources { 48 | excludes += "/META-INF/{AL2.0,LGPL2.1}" 49 | } 50 | } 51 | } 52 | 53 | dependencies { 54 | 55 | implementation("androidx.core:core-ktx:1.9.0") 56 | implementation("androidx.appcompat:appcompat:1.6.1") 57 | implementation("com.google.android.material:material:1.11.0") 58 | implementation("androidx.constraintlayout:constraintlayout:2.1.4") 59 | implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") 60 | implementation("androidx.activity:activity-compose:1.8.2") 61 | implementation(platform("androidx.compose:compose-bom:2023.03.00")) 62 | implementation("androidx.compose.ui:ui") 63 | implementation("androidx.compose.ui:ui-graphics") 64 | implementation("androidx.compose.ui:ui-tooling-preview") 65 | implementation("androidx.compose.material3:material3") 66 | implementation("androidx.compose.ui:ui-viewbinding") 67 | testImplementation("junit:junit:4.13.2") 68 | androidTestImplementation("androidx.test.ext:junit:1.1.5") 69 | androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") 70 | androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) 71 | androidTestImplementation("androidx.compose.ui:ui-test-junit4") 72 | debugImplementation("androidx.compose.ui:ui-tooling") 73 | debugImplementation("androidx.compose.ui:ui-test-manifest") 74 | } -------------------------------------------------------------------------------- /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/overlappinglist/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.example.overlappinglist 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.overlappinglist", 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/overlappinglist/DogsAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.example.overlappingrecyclerview 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.AsyncListDiffer 6 | import androidx.recyclerview.widget.DiffUtil 7 | import androidx.recyclerview.widget.RecyclerView 8 | import com.example.overlappinglist.databinding.ItemListBinding 9 | /** 10 | * Created by Rahul Ray. 11 | * Version 1.0.0 on 17,February,2024 12 | */ 13 | class DogsAdapter: RecyclerView.Adapter() { 14 | 15 | 16 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 17 | val binding = ItemListBinding.inflate(LayoutInflater.from(parent.context), parent, false) 18 | return ViewHolder(binding) 19 | } 20 | 21 | override fun onBindViewHolder(holder: ViewHolder, position: Int) { 22 | holder.bind(differ.currentList[position]) 23 | } 24 | 25 | override fun getItemCount(): Int { 26 | return differ.currentList.size 27 | } 28 | 29 | private val diffCallback = object : DiffUtil.ItemCallback(){ 30 | override fun areItemsTheSame(oldItem: Int, newItem: Int): Boolean = 31 | oldItem == newItem 32 | 33 | override fun areContentsTheSame( 34 | oldItem: Int, 35 | newItem: Int 36 | ) = oldItem == newItem 37 | } 38 | 39 | private val differ = AsyncListDiffer(this,diffCallback) 40 | 41 | fun submitData(list: List){ 42 | differ.submitList(list) 43 | } 44 | 45 | 46 | inner class ViewHolder(private val binding: ItemListBinding): RecyclerView.ViewHolder(binding.root) { 47 | fun bind(resource: Int) { 48 | binding.img.setImageResource(resource) 49 | } 50 | } 51 | 52 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/overlappinglist/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.overlappinglist 2 | 3 | import android.os.Bundle 4 | import android.widget.ScrollView 5 | import androidx.activity.ComponentActivity 6 | import androidx.activity.compose.setContent 7 | import androidx.compose.foundation.Image 8 | import androidx.compose.foundation.background 9 | import androidx.compose.foundation.border 10 | import androidx.compose.foundation.layout.Arrangement 11 | import androidx.compose.foundation.layout.Box 12 | import androidx.compose.foundation.layout.Column 13 | import androidx.compose.foundation.layout.Spacer 14 | import androidx.compose.foundation.layout.fillMaxHeight 15 | import androidx.compose.foundation.layout.fillMaxSize 16 | import androidx.compose.foundation.layout.fillMaxWidth 17 | import androidx.compose.foundation.layout.height 18 | import androidx.compose.foundation.layout.padding 19 | import androidx.compose.foundation.layout.size 20 | import androidx.compose.foundation.layout.width 21 | import androidx.compose.foundation.lazy.LazyColumn 22 | import androidx.compose.foundation.lazy.LazyRow 23 | import androidx.compose.foundation.lazy.items 24 | import androidx.compose.foundation.lazy.itemsIndexed 25 | import androidx.compose.foundation.shape.CircleShape 26 | import androidx.compose.foundation.shape.RoundedCornerShape 27 | import androidx.compose.material3.Card 28 | import androidx.compose.material3.MaterialTheme 29 | import androidx.compose.material3.Surface 30 | import androidx.compose.material3.Text 31 | import androidx.compose.runtime.Composable 32 | import androidx.compose.ui.Alignment 33 | import androidx.compose.ui.Modifier 34 | import androidx.compose.ui.draw.clip 35 | import androidx.compose.ui.graphics.Color 36 | import androidx.compose.ui.layout.ContentScale 37 | import androidx.compose.ui.layout.Layout 38 | import androidx.compose.ui.res.painterResource 39 | import androidx.compose.ui.tooling.preview.Preview 40 | import androidx.compose.ui.unit.dp 41 | import androidx.compose.ui.viewinterop.AndroidView 42 | import androidx.compose.ui.viewinterop.AndroidViewBinding 43 | import androidx.recyclerview.widget.LinearLayoutManager 44 | import com.example.overlappinglist.databinding.ActivityMainBinding 45 | import com.example.overlappinglist.ui.theme.OverlappingListTheme 46 | import com.example.overlappingrecyclerview.DogsAdapter 47 | import com.example.overlappingrecyclerview.OverlappingDecoration 48 | 49 | class MainActivity : ComponentActivity() { 50 | override fun onCreate(savedInstanceState: Bundle?) { 51 | super.onCreate(savedInstanceState) 52 | setContent { 53 | OverlappingListTheme { 54 | // A surface container using the 'background' color from the theme 55 | Surface( 56 | modifier = Modifier.fillMaxSize(), 57 | color = MaterialTheme.colorScheme.background 58 | ) { 59 | Home() 60 | } 61 | } 62 | } 63 | } 64 | 65 | companion object { 66 | val RESOURCES = listOf( 67 | R.drawable.img, 68 | R.drawable.img_1, 69 | R.drawable.img_2, 70 | R.drawable.img_3, 71 | R.drawable.img_4, 72 | R.drawable.img_5, 73 | R.drawable.img_6, 74 | R.drawable.img_7, 75 | R.drawable.img_8, 76 | R.drawable.img_9, 77 | R.drawable.img_10, 78 | R.drawable.img_11, 79 | R.drawable.img_12 80 | ) 81 | } 82 | 83 | } 84 | 85 | @Composable 86 | fun Home( 87 | modifier: Modifier = Modifier 88 | ) { 89 | Column( 90 | modifier = modifier 91 | .fillMaxWidth() 92 | .background(Color.White), 93 | verticalArrangement = Arrangement.Center 94 | ) { 95 | Column( 96 | modifier = modifier 97 | .fillMaxWidth() 98 | .background(Color.White) 99 | .padding(vertical = 32.dp), 100 | horizontalAlignment = Alignment.CenterHorizontally 101 | ) { 102 | Text(text = "Recycler View Overlapping Items") 103 | Spacer(modifier = modifier.height(16.dp)) 104 | RecyclerviewOverlapping() 105 | } 106 | Spacer(modifier = modifier 107 | .height(10.dp)) 108 | Column( 109 | modifier = modifier 110 | .fillMaxWidth() 111 | .background(Color.White) 112 | .padding(vertical = 32.dp), 113 | horizontalAlignment = Alignment.CenterHorizontally 114 | ) { 115 | Text(text = "Compose Overlapping Items") 116 | Spacer(modifier = modifier.height(16.dp)) 117 | ComposeOverlapping() 118 | } 119 | } 120 | } 121 | 122 | @Composable 123 | fun RecyclerviewOverlapping() { 124 | val dogsAdapter = DogsAdapter() 125 | AndroidViewBinding(factory = ActivityMainBinding::inflate) { 126 | rvDogs.apply { 127 | layoutManager = LinearLayoutManager(this@AndroidViewBinding.root.context, LinearLayoutManager.HORIZONTAL, false) 128 | adapter = dogsAdapter 129 | addItemDecoration(OverlappingDecoration()) 130 | } 131 | } 132 | dogsAdapter.submitData(MainActivity.RESOURCES) 133 | } 134 | 135 | @Composable 136 | fun ComposeOverlapping( 137 | modifier: Modifier = Modifier 138 | ) { 139 | 140 | 141 | LazyRow { 142 | item { 143 | Spacer(modifier = modifier.width(16.dp)) 144 | } 145 | 146 | item { 147 | OverlappingRow(overlappingPercentage = 0.20f) { 148 | for (i in MainActivity.RESOURCES) { 149 | Image( 150 | painter = painterResource(id = i), 151 | contentDescription = "image_$i", 152 | contentScale = ContentScale.Crop, 153 | modifier = modifier 154 | .size(100.dp) 155 | .clip(CircleShape) 156 | .border(4.dp, Color(0xFFFFA0A0), CircleShape) 157 | ) 158 | } 159 | } 160 | } 161 | 162 | item { 163 | Spacer(modifier = modifier.width(16.dp)) 164 | } 165 | } 166 | } 167 | 168 | @Composable 169 | fun OverlappingRow( 170 | modifier: Modifier = Modifier, 171 | overlappingPercentage: Float, 172 | content: @Composable () -> Unit 173 | ) { 174 | 175 | val factor = (1 - overlappingPercentage) 176 | 177 | Layout( 178 | modifier = modifier, 179 | content = content, 180 | measurePolicy = { measurables, constraints -> 181 | val placeables = measurables.map { it.measure(constraints) } 182 | val height = placeables.maxOf { it.height } 183 | val width = (placeables.subList(1, placeables.size).sumOf { it.width } * factor + (placeables.getOrNull(0)?.width ?: 0)).toInt() 184 | layout(width, height) { 185 | var x = 0 186 | for (placeable in placeables) { 187 | placeable.placeRelative(x, 0, 0f) 188 | x += (placeable.width * factor).toInt() 189 | } 190 | } 191 | } 192 | ) 193 | 194 | } 195 | 196 | @Preview 197 | @Composable 198 | fun HomePreview() { 199 | Home() 200 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/overlappinglist/OverlappingDecoration.kt: -------------------------------------------------------------------------------- 1 | package com.example.overlappingrecyclerview 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | import androidx.recyclerview.widget.LinearLayoutManager 6 | import androidx.recyclerview.widget.RecyclerView 7 | 8 | /** 9 | * Created by Rahul Ray. 10 | * Version 1.0.0 on 17,February,2024 11 | */ 12 | class OverlappingDecoration: RecyclerView.ItemDecoration() { 13 | 14 | private val overlapPercentage = 15 15 | 16 | override fun getItemOffsets( 17 | outRect: Rect, 18 | view: View, 19 | parent: RecyclerView, 20 | state: RecyclerView.State 21 | ) { 22 | val width = view.layoutParams.width 23 | 24 | val widthPercentage = (overlapPercentage * width * -1) / 100 25 | 26 | val position = parent.getChildAdapterPosition(view) 27 | 28 | val isReversed = (parent.layoutManager as? LinearLayoutManager)?.reverseLayout ?: false 29 | 30 | if (position == 0) { 31 | return 32 | } else { 33 | if (isReversed) { 34 | outRect.set(0, 0, widthPercentage, 0) 35 | } else { 36 | outRect.set(widthPercentage, 0, 0, 0) 37 | } 38 | } 39 | 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/overlappinglist/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.example.overlappinglist.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/overlappinglist/ui/theme/Theme.kt: -------------------------------------------------------------------------------- 1 | package com.example.overlappinglist.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.runtime.SideEffect 13 | import androidx.compose.ui.graphics.toArgb 14 | import androidx.compose.ui.platform.LocalContext 15 | import androidx.compose.ui.platform.LocalView 16 | import androidx.core.view.WindowCompat 17 | 18 | private val DarkColorScheme = darkColorScheme( 19 | primary = Purple80, 20 | secondary = PurpleGrey80, 21 | tertiary = Pink80 22 | ) 23 | 24 | private val LightColorScheme = lightColorScheme( 25 | primary = Purple40, 26 | secondary = PurpleGrey40, 27 | tertiary = Pink40 28 | 29 | /* Other default colors to override 30 | background = Color(0xFFFFFBFE), 31 | surface = Color(0xFFFFFBFE), 32 | onPrimary = Color.White, 33 | onSecondary = Color.White, 34 | onTertiary = Color.White, 35 | onBackground = Color(0xFF1C1B1F), 36 | onSurface = Color(0xFF1C1B1F), 37 | */ 38 | ) 39 | 40 | @Composable 41 | fun OverlappingListTheme( 42 | darkTheme: Boolean = isSystemInDarkTheme(), 43 | // Dynamic color is available on Android 12+ 44 | dynamicColor: Boolean = true, 45 | content: @Composable () -> Unit 46 | ) { 47 | val colorScheme = when { 48 | dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { 49 | val context = LocalContext.current 50 | if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) 51 | } 52 | 53 | darkTheme -> DarkColorScheme 54 | else -> LightColorScheme 55 | } 56 | val view = LocalView.current 57 | if (!view.isInEditMode) { 58 | SideEffect { 59 | val window = (view.context as Activity).window 60 | window.statusBarColor = colorScheme.primary.toArgb() 61 | WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme 62 | } 63 | } 64 | 65 | MaterialTheme( 66 | colorScheme = colorScheme, 67 | typography = Typography, 68 | content = content 69 | ) 70 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/overlappinglist/ui/theme/Type.kt: -------------------------------------------------------------------------------- 1 | package com.example.overlappinglist.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/drawable/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_1.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_10.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_11.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_12.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_2.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_3.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_4.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_5.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_6.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_7.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_8.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/drawable/img_9.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /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/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raystatic/OverlappingLists/3e6b61c408da2879d9dcb7b0b3e5af43a3032008/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 | OverlappingList 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |