Compose-actors - Android app built with jetpack compose follows new revamped guide to app architecture

Overview

Compose Actors ๐Ÿ’ƒ

Inspired from

JetCaster JetNews JetSnack

More compose content

AppBanner

๐Ÿ—ผ Architecture

Follows new architecture guide updated on 14 December 2021 from revamped guide to app architecture.

๐ŸŽน Layer of this app.

Network Repository ViewModels Screens
Data
๐ŸŽ ๐ŸŽ
๐ŸŽ ๐ŸŽ
---> Source
๐ŸŽ
--->
Suspend
Coroutines
โžฐ โžฐ
--->
State
Composables
๐Ÿ“ฑ ๐Ÿ“ฑ
๐Ÿ“ฑ ๐Ÿ“ฑ

ArchitectureLayer

๐Ÿก App Overview Compose Blog

Android app built with Jetpack Compose shows actors information fetched from Tmdb Api. You may install and try to understand the code better, but make sure you provide your own Tmdb api key for data to show up in directory /utils/ApiKey.kt.

Screen Preview
Home Screen (Default destination)

โ€ข Shows category list of actors in row of type popular & trending.
โ€ข Has it's own ViewModel to manage it's ui state.
โ€ข Custom TopAppBar container with search box.
โ€ข Navigates to Search screen clicking search box.
โ€ข Navigates to Detail screen with castId clicking any cast item.
โ€ข If user is offline snackbar message is shown.
โ€ข CircularProgressIndicator will be shown untill data is fetched.
โ€ข Image fetching with Coil, manages state error/placeholder.
Home screen preview
Search Screen

โ€ข Shows list of actors based on user submitted query.
โ€ข Animatable shapes infinitely repeatable.
โ€ข Has it's own ViewModel to manage it's ui state.
โ€ข TextField contained in TopAppBar completely transparent.
โ€ข Navigates to Detail screen with castId clicking any cast item.
โ€ข Screen and animation state changes on search began.
โ€ข Handles query & value changes correctly to fetch results.
โ€ข Draw Arc/Line on canvas & animate to shape shift like search icon.
โ€ข Different colors for animatables for both light/dark theme.
Search screen preview
Detail Screen

โ€ข Shows user selected actor from other screens.
โ€ข Has it's own ViewModel to manage it's ui state.
โ€ข Reveal effect animation added to few composables.
โ€ข CircularProgressIndicator will be shown untill data is fetched.
โ€ข Image fetching with Coil, manages state error/placeholder.
โ€ข Background image with gradient foreground effect.
โ€ข Draws dynamic color behind system bars.
Detail screen preview

๐Ÿ” Search Animation

// Simple progressive circle looking animation
val animateCircle = remember { Animatable(0f) }.apply {
    AnimateShapeInfinitely(this)
}

@Composable
fun AnimateShapeInfinitely(
    // shape which will be animated infinitely.
    animateShape: Animatable<Float, AnimationVector1D>,
    // final float state to be animated.
    targetValue: Float = 1f,
    // duration took for animating once.
    durationMillis: Int = 1000
) {
    LaunchedEffect(animateShape) {
        animateShape.animateTo(
            targetValue = targetValue,
            animationSpec = infiniteRepeatable(
                animation = tween(durationMillis, LinearEasing),
                repeatMode = RepeatMode.Restart
            )
        )
    }
}

Although I couldn't fully achieve the desired result as I imagined, I've settled for this current state for now.

Offline Dark

Calling the function once will draw a circle, in my example I have drawn it thrice with differnt colors, radius and scales.

DrawCircleOnCanvas(
    scale = scaleInfiniteTransition(targetValue = 2f, durationMillis = 600),
    color = circleColor,
    radiusRatio = 4f
)

I have kept all initial states of 3 circles to 0f to make end result much smoother.
Random or uneven gaps between initial/target/durationMillis will make end animation look more abrupt and aggressively pushing it's bounds.

@Composable
private fun scaleInfiniteTransition(
    initialValue: Float = 0f,
    targetValue: Float,
    durationMillis: Int,
): Float {
    val infiniteTransition = rememberInfiniteTransition()
    val scale: Float by infiniteTransition.animateFloat(
        initialValue = initialValue,
        targetValue = targetValue,
        animationSpec = infiniteRepeatable(
            animation = tween(durationMillis, easing = LinearEasing),
            repeatMode = RepeatMode.Reverse
        )
    )
    return scale
}
@Composable
fun DrawCircleOnCanvas(
    scale: Float,
    color: Color,
    radiusRatio: Float
) {
    Canvas(
        modifier = Modifier
            .fillMaxSize()
            .graphicsLayer {
                scaleX = scale
                scaleY = scale
            }
    ) {
        val canvasWidth = size.width
        val canvasHeight = size.height
        drawCircle(
            color = color,
            center = Offset(
                x = canvasWidth / 2,
                y = canvasHeight / 2
            ),
            radius = size.minDimension / radiusRatio,
        )
    }
}

๐Ÿ“ด Offline state

Dark Light
Offline Dark Offline Light

Show a Snackbar message with SnackbarHostState.

if (!isOnline) {
    LaunchedEffect(scope) {
        scope.launch {
            scaffoldState.snackbarHostState.showSnackbar(
                message = context.getString(R.string.offline_snackbar_message),
                duration = SnackbarDuration.Indefinite
            )
        }
    }
}

ViewModels

All screens have their own ViewModels for managing the ui state.

class HomeViewModel(
    application: Application,
    private val repository: AppRepository
) : AndroidViewModel(application) {

    // Holds the state for values in HomeViewState
    var uiState by mutableStateOf(HomeViewState())
        private set

    init {
        // Update the values in uiState from all data sources.
        viewModelScope.launch {
            uiState = HomeViewState(isFetchingActors = true)
            val popularActorsList = repository.getPopularActorsData()
            val trendingActorsList = repository.getTrendingActorsData()
            uiState = HomeViewState(
                popularActorList = popularActorsList,
                trendingActorList = trendingActorsList,
                isFetchingActors = false
            )
        }
    }
}

Model for UI state of the screen.

data class HomeViewState(
    var popularActorList: List<Actor> = emptyList(),
    var trendingActorList: List<Actor> = emptyList(),
    val isFetchingActors: Boolean = false,
)

ViewModel used in a screen-level composable.

@Composable
fun HomeScreen(
    viewModel: HomeViewModel
) {
    val uiState = viewModel.uiState
    Box {
        ScreenContent(uiState.popularActorList)
    }
}

Repository

All ViewModels have access to repository which has single instance.

class AppRepository {

    private val networkDataSource by lazy { NetworkDataSource() }

    suspend fun getPopularActorsData(): List<Actor> {
        val listData: List<Actor>
        withContext(Dispatchers.IO) {
            listData = networkDataSource.getPopularActors()
        }
        return listData
    }
}

Instantiated repository will be passed to all ViewModels.

val repository = (application as ComposeActorsApp).repository

NavHost(
    navController = navController,
    startDestination = startDestination
) {
    composable(
        "Destination Route"
    ) {
        HomeScreen(
            viewModel = viewModel(
                factory = HomeViewModel.provideFactory(
                    application, repository
                )
            )
        )
    }
}

๐Ÿ”จ Structure

๐Ÿ“ data ๐Ÿ“ navigation ๐Ÿ“ repository ๐Ÿ“ root
๐Ÿ“„ NetworkDataSource.kt
๐Ÿ“„ JsonRemoteData.kt
๐Ÿ“„ Urls.kt
๐Ÿ“„ AppActions.kt
๐Ÿ“„ AppDestinations.kt
๐Ÿ“„ AppNavigation.kt
๐Ÿ“„ AppRepository.kt ๐Ÿ“„ MainActivity.kt
๐Ÿ“„ Application.kt
๐Ÿ“ ui ๐Ÿ“ utils ๐Ÿ“ model
๐Ÿ“ home
๐Ÿ“ details
๐Ÿ“ search
๐Ÿ“ components
๐Ÿ“ theme
๐Ÿ“„ InfiniteFlowingThings.kt
๐Ÿ“„ RevealEffect.kt
๐Ÿ“„ Utilities.kt
๐Ÿ“„ DynamicThemeGenerator.kt
๐Ÿ“„ NetworkManager.kt
๐Ÿ“„ NetworkQueryUtils.kt
๐Ÿ“„ Actor.kt
๐Ÿ“„ ActorDetail.kt
๐Ÿ“„ Movie.kt

๐Ÿ“ Packages in ui

๐Ÿ“ home ๐Ÿ“ details ๐Ÿ“ search ๐Ÿ“ components ๐Ÿ“ theme
๐Ÿ“„ HomeScreen.kt
๐Ÿ“„ HomeViewModel.kt
๐Ÿ“„ DetailsScreen.kt
๐Ÿ“„ DetailsViewModel.kt
๐Ÿ“„ SearchScreen.kt
๐Ÿ“„ SearchViewModel.kt
๐Ÿ“„ AnimatedSearch.kt
๐Ÿ“„ AppBars.kt
๐Ÿ“„ Components.kt
๐Ÿ“„ NetworkImage.kt
๐Ÿ“„ Progress.kt
๐Ÿ“„ Color.kt
๐Ÿ“„ Shape.kt
๐Ÿ“„ Theme.kt
๐Ÿ“„ Type.kt

๐ŸŒ€ Image loading with Coil

Reusable composable used in all screens to load image from an Url.

@Composable
fun LoadNetworkImage(
    imageUrl: String,
    contentDescription: String,
    modifier: Modifier,
    shape: Shape
) {
    Image(
        painter = rememberImagePainter(
            data = imageUrl,
            builder = {
                placeholder(R.drawable.animated_progress)
                error(R.drawable.ic_image_not_available)
            }),
        contentDescription = contentDescription,
        contentScale = ContentScale.Crop,
        modifier = modifier
            .clip(shape)
            .background(color = MaterialTheme.colors.surface)
    )
}

Then we will just call the composable anywhere in app screens.

LoadNetworkImage(
    imageUrl = "https://image_url",
    contentDescription = stringResource(R.string.cd_movie_poster),
    modifier = Modifier.size(100.dp, 150.dp),
    shape = MaterialTheme.shapes.medium,
)

๐ŸŽจ App Theme

๐ŸŒˆ Material Design 3.

Followed theming and color practices from Material Theme Builder Web Tool. Learn more here

Color.kt

// Light theme colors
val light_primary = Color(0xFFaa370c)
val light_onPrimary = Color(0xFFffffff)
val light_background = Color(0xFFFFFAF9)
val light_onBackground = Color(0xFF211a18)
val light_surface = Color(0xFFFFE6DB)
val light_onSurface = Color(0xFF211a18)

// Dark theme colors
val dark_primary = Color(0xFFffb59c)
val dark_onPrimary = Color(0xFF5f1600)
val dark_background = Color(0xFF211a18)
val dark_onBackground = Color(0xFFede0dc)
val dark_surface = Color(0xFF302522)
val dark_onSurface = Color(0xFFede0dc)

Theme.kt

val LightColorPalette = lightColors(
    primary = light_primary,
    onPrimary = light_onPrimary,
    background = light_background,
    onBackground = light_onBackground,
    surface = light_surface,
    onSurface = light_onSurface,
)

val DarkColorPalette = darkColors(
    primary = dark_primary,
    onPrimary = dark_onPrimary,
    background = dark_background,
    onBackground = dark_onBackground,
    surface = dark_surface,
    onSurface = dark_onSurface
)

โšช โšซ Light/Dark theme screenshots

Home Search Detail
Home Dark
Home Light
Search Dark
Search Light
Detail Dark
Detail Light

๐Ÿ“ Blog

Article banner
Reveal effect animations in compose jetpack android
Read article
Article banner
Compose and build android app with new architecture principles
Read article
Article banner
Custom shape animations pulsating circles on canvas in compose android
Read article
Article banner
Search with TextField in list Compose Android Jetpack
Read article

AppPreview

๐Ÿ’ก Motivation and Context

Jetpack Compose is Androidโ€™s modern toolkit for building native UI. It enables you to quickly bring your app to life with less code, powerful tools, and intuitive Kotlin APIs.

Understanding to implement own Theme Shape Typography Color has became bit easier by referring to lot of official jetpack compose samples which are available in GitHub.

Best of all we got to do this in Kotlin way. Excited and long way to go from here.

๐Ÿ† Credits

๐Ÿš€ JetCaster

Check the official JetCaster example from Android Team, I have used their code to generate Swatch with Palette Api in my Detail screen.

๐Ÿ”‘ Tmdb Api

Images and all information in app belongs to and taken from Tmdb Api. I do not own any of it and only made use of it for this app demonstration purpose.

Obtain your own Tmdb Api Key from here

License

Copyright 2021 Rajasekhar K E

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Updated project packages/files, restructure composables for previewing

    Updated project packages/files, restructure composables for previewing

    What has changed

    • Improved code/file packaging - new datasource package with remote/local data
    • Separate the ViewModel param from Screen and UI composables to see previews for all screens.
    • Break composables into smaller for previewing, breaking is done, need to add previews.
    • Break composables into smaller and move them to separate composables packages in each screen.
    • Inside each screen package created a file which contains data and model classes for each screen. This will be later structured into containing state with sealed classes.
    • Added new tasks for the current roadmap v0.3.0
    documentation improvement 
    opened by RajashekarRaju 0
  • UI packaging and file structure focused on Actor Detail

    UI packaging and file structure focused on Actor Detail

    The proposal here is to create the standard of separating UI, ViewModel and View, where the UI only holds data and references to actions, the view resolves state observation and mild data concatenation and the bridge between ViewModel and UI. This will allow us now to preview every screen in our UI package.

    The organization proposal over composables and data is that every individual composable will sit in its own file and every data class will sit in its on file resting inside of their respective packages.

    opened by cicerohellmann 0
  • Organized project files and packages. Improved repository, data, datasource structure

    Organized project files and packages. Improved repository, data, datasource structure

    What's Changes

    Basically whatever packages/files everything which were inside package repository is now moved to different data package. Code quality and organized every file and functions visibility correctly for each composables

    | Before | Now | Final | | ------- | ----- | ----- | | Before | after | Final |

    • Renamed database name to AppDatabase from FavoritesDatabase.kt, because there can be multiple entities instead of just favorites.
    • ~Introduced datasource layer, this will separate data from all repositories. There was separate datasource file for data coming from network. Now this is added to database too. These both files are moved to new package called datasource.~
    • Extracted all animations to a dedicated package, moved reusable modifiers to new file in components.
    • Extracted Navigation layer into UI packages since they are compose specific.
    • Updated readme with new and upcoming changes in roadmap.
    documentation improvement 
    opened by RajashekarRaju 0
  • Moving to new working tree v0.3.0 Roadmap

    Moving to new working tree v0.3.0 Roadmap

    Roadmap

    • Let users search for movies directly just like searching for actors.
    • Collapsable TopBars, BottomBars, Scroll effects, new animations.
    • Add feature for adding actors to favorites like movies.
    documentation 
    opened by RajashekarRaju 0
  • Wrapping up new release v0.2.0 with new features.

    Wrapping up new release v0.2.0 with new features.

    New release - v0.2.0

    • [x] Add DI with Koin.
    • [x] Modal bottom sheets & Bottom sheets.
    • [x] Migrate to compose insets from accompanist.
    • [x] Add new movie details screen, made changes to actors details screen.
    • [x] Improved search functionality, added voice search, handled keyboard changes.
    • [x] New feature to add Movie to favorites.
    • [x] Add new database repository layer for favorites.
    • [x] Add tabs in Home screen with actors/movies/favorites categories.
    feature 
    opened by RajashekarRaju 0
  • Handled empty states, progress bars, text visibilities for light/dark themes in all screens.

    Handled empty states, progress bars, text visibilities for light/dark themes in all screens.

    What's Changed

    • Show empty favorite state when no favorites are available in database.
    • Only show progress bar when data is loading and hide if API is missing.
    • Progress bar added to each tab screen instead of only home screen.
    • Added extra parent with background to bottom sheet to make scrollable text visible for both light/dark theme.
    • Upgraded to new versions
      • Gradle build tools
      • Kotlin version
      • Compose to beta
    feature 
    opened by RajashekarRaju 0
  • Wrapped up all tasks, updated docs, ready for v0.2.0

    Wrapped up all tasks, updated docs, ready for v0.2.0

    What's Changed :

    • Modal sheet for viewing selected movie cast from movie details.
    • Created reusable composables, broke down many composable into smaller components.
    • Renamed files/composables more descriptively to avoid confusion between movie/actor details screens.
    • For few actors with missing json data to avoid crash added null checks.
    • Removed unnecessary animated visibility modifiers for text properties.
    • Updated docs, wrapped up all tasks.
    documentation enhancement 
    opened by RajashekarRaju 0
  • One last task to complete v0.2.0, updated new roadmap tasks

    One last task to complete v0.2.0, updated new roadmap tasks

    What's Changed

    • User can now view actor details from modal bottom sheet without navigating to details screen directly.
    • Removed few UI elements which were not necessary.
    • Updated material dependency, found no issues in current app state.
    • Finalized all tasks for new release v0.2.0, just one to go.

    Updated roadmap v0.3.0, added 3 new tasks.

    • [ ] Let users search for movies directly just like searching for actors.
    • [ ] Collapsable TopBars, BottomBars, Scroll effects, new animations.
    • [ ] Add feature for adding actors to favorites like movies.
    enhancement 
    opened by RajashekarRaju 0
  • Completed 3 new tasks in Roadmap.

    Completed 3 new tasks in Roadmap.

    What's Changes :

    HomeScreen

    • Added tabs to home with 3 categories.
      • MoviesTab with Upcoming & Now playing movies.
      • ActorsTab with no changes.
      • FavoritesTab shows all user favorite movies/actors.
    • Added ModalBottomSheet to Home for viewing selected movie overview instead of navigating to detail page directly.
    • Added new Ui data state to manage content in modal sheets.
    • Both Favorites/Movies Tabs can launch same modal sheet composable with different data.

    MovieDetailsScreen

    • Users can now add/remove movie to favorites. Will implement this later directly to item list enabling user to add any movie/actor to favorites without visiting details screen.
    • Replaced fab button with animated extended floating action button to make user aware of favorite state with text.
    • Injected network/database repository parameters to ViewModel to perform database operations directly.

    Tasks Completed

    • [x] Add new movie details screen, made changes to actors details screen.
    • [x] New feature to add Movie to favorites and add database repository layer for favorites.
    • [x] Add tabs in Home screen with actors/movies/favorites categories.
    enhancement 
    opened by RajashekarRaju 0
  • Changes to network and database repository

    Changes to network and database repository

    NetworkRepository

    Added new functions to all network and data request classes to fetch new movie category properties.

    • 5 Upcoming movies
    • Now playing movies

    DatabaseRepository

    • Added Room dependencies and plugins
    • Updated queries to correctly check if movie is available in favorites table.
    • Made corrections to functions which were missing suspend modifiers, dispatchers.
    opened by RajashekarRaju 0
  • Setup room for adding user favorite actor/movie. Added extra repository.

    Setup room for adding user favorite actor/movie. Added extra repository.

    What's Changes :

    • Added room database dependencies.
    • Created separate repository for database data source, moved all network files to new packages.
    • Renamed previously used single AppRepository to NetworkRepository.
    • Completing setting up database with entities/daos for actor, movie data types with data object convertors.
    • Included new database module to koin modules.
    enhancement 
    opened by RajashekarRaju 0
Releases(v0.2.0)
  • v0.2.0(May 29, 2022)

    Build for open source :blue_heart:

    • Added DI to project with Koin.
    • Added tabs in Home screen with actors/movies/favorites categories.
    • Modal bottom sheets & Bottom sheets for showing overviews.
    • Migrate to compose insets from accompanist.
    • Added new movie details screen, made changes to actors details screen.
    • Improved search functionality, added voice search, handled keyboard changes.
    • New feature to add Movie to favorites with Room database.
    • Added new database repository layer for favorites.

    Please follow readme for clear info. Full Changelog: https://github.com/RajashekarRaju/compose-actors/compare/v0.1.0...v0.2.0

    Source code(tar.gz)
    Source code(zip)
    app-release-v0.2.0.apk(3.68 MB)
  • v0.1.0(Jan 5, 2022)

    Build for open source :blue_heart:

    • Completed building android app with compose.
    • Starting with 3 screen destinations.
    • Follows newest android best architecture practices.
    • ViewModels, coroutines, Repository pattern, single data network source.
    • UI handling and state handling.
    • Material design 3 tooling. Light/dark theme support.
    • Wrote four articles as of now, based on this repository.
    • Added many custom animations, improved canvas usage.
    • Data supported from Tmdb Api.

    Please follow up readme for clear info.

    Source code(tar.gz)
    Source code(zip)
Owner
Raj
I'm not sure about Mars, but definitely down to Earth guy.
Raj
With MVVM Architecture pattern using Android Architecture Components This is a sample app demonstrating Youtube player animation using constraint layout

Youtube UI/UX Animation This is a sample app demonstrating Youtube UX/UI animation using ConstraintLayout.It implements the Keyframe Animation feature

Burhanuddin Rashid 866 Dec 29, 2022
BaseAnimation network Android animation set, custom controls, nearly 200 kinds of source code๏ผ BaseAnimation, if a new version is updated automatically to remind everyone, I hope everyone will contribute their animated XML files or other source, together to create this open source app๏ผ

#BaseAnimation (below chart) #ๅŠจ็”ปๅˆ้›† ๏ผˆไธ‹้ขๆœ‰ๆ•ˆๆžœๅ›พ๏ผ‰ไฟฎๆ”นๅˆ†ๆ”ฏ ไธปๅนฒ English Description BaseAnimation network Android animation set, custom controls, nearly 200 kinds

DuGuang 1k Dec 14, 2022
A backport of the new Transitions API for Android

TransitionsBackport Android library for using the Transitions API released with Android KitKat on older versions of Android. At the moment, it is comp

Stรฉphane Guรฉrin 578 Dec 29, 2022
Add Animatable Material Components in Android Jetpack Compose. Create jetpack compose animations painless.

AnimatableCompose Add Animatable Material Components in Android Jetpack Compose. Create jetpack compose animation painless. What you can create from M

Emir Demirli 12 Jan 2, 2023
Portfolio-kobweb - A sample project for portfolio built using Kobweb project bootstrapped with the site template

This is a sample project for portfolio built using Kobweb project bootstrapped w

Khalid 6 Mar 26, 2022
PassCode is the Android app made by using Jetpack Compose. Created for the test task submission.

PassCode PassCode is the Android app made by using the Jetpack Compose. Created for the test task submission. Showcase Dark Theme Light Theme ACs The

Basil Miller 1 May 25, 2022
Group of libraries to help you build better animations with Jetpack Compose

Group of libraries to help you build better animations with Jetpack Compose

null 36 May 12, 2022
DrawBox: a multi-purpose tool to draw anything on canvas, written completely on jetpack compose

DrawBox DrawBox is a multi-purpose tool to draw anything on canvas, written comp

Akshay Sharma 172 Dec 30, 2022
Examples of the use of animations in jetpack compose and view, as well as measurements of perfomance

AndroidAnimationWorld ะŸั€ะธะผะตั€ั‹ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธั ะฐะฝะธะผะฐั†ะธะน ะฒ jetpack compose ะธ view, ะฐ ั‚ะฐะบะถะต ะทะฐะผะตั€ั‹ perfomance ะดะปั

Lukian Zhukov 7 Oct 22, 2022
๐Ÿช Jetpack Compose animation library that allows you to implement animations such as shared element transition.

Orbitary ?? Jetpack Compose animation library that allows you to implement animations such as shared element transition. Download Gradle Add the depen

Jaewoong Eum 503 Dec 30, 2022
Jetpack Compose Animations

Jetpack Compose Animations Animations Duolingo Owl - Anmol Verma Screen.

Anmol Verma 218 Dec 29, 2022
Trying to play with Jetpack compose low level animations APIs, which are animate*AsState APIs.

ComposeSimpleAnimation Trying to play with Jetpack compose low level animations APIs, which are animate*AsState APIs that I needed in another project.

Mustafa Ibrahim 39 Dec 10, 2022
๐Ÿช Jetpack Compose animation library that allows you to implement animations such as shared element transition.

?? Jetpack Compose animation library that allows you to implement animations such as shared element transition.

Jaewoong Eum 504 Jan 2, 2023
Set of extra Transitions on top of Jetpack Transitions Library

Transitions Everywhere Set of extra Transitions on top of AndroidX Transitions Library. About Article about transitions and library Originally this li

Andrey Kulikov 4.9k Dec 30, 2022
Set of extra Transitions on top of Jetpack Transitions Library

Transitions Everywhere Set of extra Transitions on top of AndroidX Transitions Library. About Article about transitions and library Originally this li

Andrey Kulikov 4.8k Apr 27, 2021
RX-based async paradigm, Room, DI (Hilt), Retrofit, MVVM, Jetpack, Lottie, Transitions

CatBreedsApp RxJava, Room, DI (Hilt), Jetpack, Shared element transition. clean MVVM architecture, Retrofit Cats need your help, we want to build an a

Cristian Dumitrache 3 Oct 14, 2022
Library provides an easy way to a add shimmer effect in Android Compose project.

Add a shimmer effect to the layout in Android Compose

Valery 66 Dec 14, 2022
"Gooey-Effect" for android-compose

Gooey effect for android-compose "Gooey" is a library made to use "gooey-effect" that exists as a CSS trick in android-compose. Download repositories

SeokHo-Im 5 Oct 12, 2022
A sample implementation Compose BottomSheet with animation different states

Compose Animated BottomSheet A sample implementation Compose BottomSheet with animation different states Medium post: https://proandroiddev.com/how-to

Yahor 40 Jan 6, 2023