A lightweight particle system for Jetpack Compose - Quarks

Overview

compose-particle-system

Quarks is a lightweight particle system for Jetpack Compose. There are endless possibilities for creating generative art with this particle system. Here are few examples -

Fountain Meteor Confetti Explosion Snowfall
fountain meteor confetti explosion snowfall

Getting started

  1. Add the following dependencies in your build.gradle file
implementation "me.nikhilchaudhari:quarks:1.0.0-alpha01"
  1. Call CreateParticles(...) composable function
 Box(
    modifier = Modifier
        .fillMaxSize()
        .background(Color.Black)
) {
    CreateParticles(
        modifier = Modifier.fillMaxSize(),
        // Set the initial position particles (From where do you want to shoot/generate particles)
        x = 500f, y = 1000f,
        // Set the velocity of particle in x and y direction
        velocity = Velocity(xDirection = 1f, yDirection = 1f),
        // Set the force acting on particle
        force = Force.Gravity(0f),
        // set acceleration on both x and y direction
        acceleration = Acceleration(0f, 0f),
        // set the desired size of particle that you want
        particleSize = ParticleSize.RandomSizes(25..100),
        // set particle colors or color
        particleColor = ParticleColor.RandomColors(listOf(Color.White, Color.Yellow, Color.Red, Color.Blue)),
        // set the max lifetime and aging factor of a particle
        lifeTime = LifeTime(255f, 0.2f),
        // set the emission type - how do you want to generate particle - as a flow/stream, as a explosion/blast
        emissionType = EmissionType.ExplodeEmission(numberOfParticles = 100),
        // duration of animation 
        durationMillis = 10 * 1000
    )
}
  1. That's it. You're done. Check the configuration section to apply the required configs to your particle system.

Configuration

This Particle system (or any other particle system) runs on basic physics principles like velocity, force, acceleration etc. Also the emission of particle can be done in two ways 1. A continuous stream/flow of particle or 2. Explosion/Bursting of particles. To apply various configuration to particle system, here are the things you can configure for a particle and as well as for a system -

Position

Set the initial position of particle emitter, from where do you want to start the emission. Set position x = 500f and y = 500f. This is canvas, coordinate system starts from top left corner. Horizontal - right direction is positive x axis and vertical-downwards is positive y axis.

 CreateParticles(
   //...
    x = 500f, y = 1000f,
  //...
)

Emission Type

Set emission type to set particle emission as flow/stream of steady particles or as explosion at once.

EmissionType.ExplodeEmission 🎊

If you want to explode/burst particles at once, you can set emission type to emissionType = EmissionType.ExplodeEmission(numberOfParticles = 100). Pass the number of particles that you want at the time of explosion.

// TODO - add gif

EmissionType.FlowEmission πŸ’§

Definite Emission

If you want a slow and steady stream/flow of constant number of particles, set emissionType = EmissionType.FlowEmission(maxParticlesCount = 500, emissionRate = 0.6f).

Pass the maximum number of particles you want for ex, maxParticlesCount = 500. This will create a steady flow of 500 particles.

Indefinite Emission

If you want an indefinite stream/flow of particles you can set maxParticlesCount = EmissionType.FlowEmission.INDEFINITE. This will create an indefinite steady flow of infinite number of particles.

⚠️ durationMillis = 10000 config does not work for indefinite emission. It'll run continuously, so make sure you only use it whenever needed. The stopping mechanism is yet to be added in the code.

Duration ⏰

Set the duration value durationMillis = 10000 for how long do you want to run the animation. Your animation of particle will run for the given number of milliseconds. Duration won't work for indefinte emission of particles.

Default value = 10000

Velocity 🚀

You can define the particle velocity in both directions. Set velocity = Velocity(xDirection = 1f, yDirection = 1f, angle = TWO_PI, randomize = true).

  1. Angle -

    By default, the angle is used to compute the sin and cos components of velocity over x and y direction. And the supplied values of xDirection and yDirection acts as magnitude. Default valye of angle is TWO_PI (in radians). You can set angle value in radians.

  2. Randomizing velocities -

    By default, random velocities are applied to each particles but you can configure to keep it single value. Change the randomize=false flag to false.

Default value = Velocity(xDirection = 1f, yDirection = 1f, angle = TWO_PI, randomize = true)

Force πŸ‹οΈ

Force can be applied on each particle. Two types of force options are available.

  1. Force.Gravity -

    You can apply gravitational force on particle by setting force = Force.Gravity(magnitude = 2f). This way particle will experience a downward force If you pass the negative value in the magnitude then it'll become an anti-gravity and particle will experience an upward force.

  2. Force.Wind - 🎐

    You can apply Wind force on each particle in both directions. force = Force.Wind(1.5f, 0.3f). Wind will move particle in the specified direction.

Default value = Force.Gravity(0.0f)

Acceleration πŸƒ

You can apply acceleration by setting acceleration = Acceleration(xComponent = 1f, yComponent = 1f). Acceleration (x and y component) will be applied uniformly on each frame of animation to a particle.

Default value = Acceleration(0f, 0f)

Particle Size 🌏

You can configure particle size in two ways.

  1. Setting random size of particles

    particleSize = ParticleSize.RandomSizes(25..100) Set range of sizes and a random size will be applied to each particle.

  2. Setting fixed size

    particleSize = ParticleSize.ConstantSize(25f) sets the constant size to each particle.

Default value = ParticleSize.ConstantSize(25f)

Particle Color πŸ”Ά

You can configure random colors or single color to a particle.

  1. Random colors -

    particleColor = ParticleColor.RandomColors(listOf(Color.White, Color.Yellow, Color.Red, Color.Blue)) pass the list of colors and a random value will be selected and applied to different particles.

  2. Single color -

    particleColor = ParticleColor.SingleColor(Color.Yellow) sets the single color to each particle.

Default value = ParticleColor.SingleColor(Color.Yellow)

Lifetime & Aging factor πŸ§β€β™‚οΈ

Set the lifetime of a particle to a value and an aging factor by which the life of particle is reduced in each frame.

lifeTime = LifeTime(maxLife = 255f, agingFactor = 1f)

Here at each frame the againgFactor will be removed from the maxlife value of particle.

Default value = LifeTime(maxLife = 255f, agingFactor = 1f)

TODOs

  • Add angular velocity
  • Add stopping mechanism for infinite flow
  • Add a custom onDraw() config to let user draw anything as a particle shape.

License

Licensed under Apache License, Version 2.0 here

You might also like...
Decathlon Design System UI components for Compose applications
Decathlon Design System UI components for Compose applications

Vitamin Compose Decathlon Design System libraries for android applications Website Compose Decathlon Design System is based on Material Design compose

Jetpack Compose Boids | Flocking Insect 🐜. bird or Fish simulation using Jetpack Compose Desktop πŸš€, using Canvas API 🎨
Jetpack Compose Boids | Flocking Insect 🐜. bird or Fish simulation using Jetpack Compose Desktop πŸš€, using Canvas API 🎨

🐜 🐜 🐜 Compose flocking Ants(boids) 🐜 🐜 🐜 Jetpack compose Boids | Flocking Insect. bird or Fish simulation using Jetpack Compose Desktop πŸš€ , usi

A collection of animations, compositions, UIs using Jetpack Compose. You can say Jetpack Compose cookbook or play-ground if you want!
A collection of animations, compositions, UIs using Jetpack Compose. You can say Jetpack Compose cookbook or play-ground if you want!

Why Not Compose! A collection of animations, compositions, UIs using Jetpack Compose. You can say Jetpack Compose cookbook or play-ground if you want!

Learn Jetpack Compose for Android by Examples. Learn how to use Jetpack Compose for Android App Development. Android’s modern toolkit for building native UI.
Learn Jetpack Compose for Android by Examples. Learn how to use Jetpack Compose for Android App Development. Android’s modern toolkit for building native UI.

Learn Jetpack Compose for Android by Examples. Learn how to use Jetpack Compose for Android App Development. Android’s modern toolkit for building native UI.

This is a sample app(For beginners - App #2) built using Jetpack Compose. It demonstrates the concept of State Hoisting in Jetpack Compose.
This is a sample app(For beginners - App #2) built using Jetpack Compose. It demonstrates the concept of State Hoisting in Jetpack Compose.

JetBMICalculator This is a sample app(For beginners - App #2) built using Jetpack Compose. It demonstrates the concept of State Hoisting in Jetpack Co

Jetpack-Compose-Demo - Instagram Profile UI using Jetpack Compose
Jetpack-Compose-Demo - Instagram Profile UI using Jetpack Compose

Jetpack-Compose-Demo Instagram Profile UI using Jetpack Compose

Jetpack-compose-animations-examples - Cool animations implemented with Jetpack compose
Jetpack-compose-animations-examples - Cool animations implemented with Jetpack compose

Jetpack-compose-animations-examples This repository consists of 4 animations: St

Compose-navigation - Set of utils to help with integrating Jetpack Compose and Jetpack's Navigation

Jetpack Compose Navigation Set of utils to help with integrating Jetpack Compose

Jetpack-compose-uis - A collection of some UIs using Jetpack Compose. built using Katalog

Jetpack Compose UIs This is a collection of some UIs using Jetpack Compose. It i

Comments
  • Fatal Exception: java.lang.NumberFormatException

    Fatal Exception: java.lang.NumberFormatException

    Hello,

    Loved the library :) Found a crash when roundTo.

    Fatal Exception: java.lang.NumberFormatException: For input string: "0,999"
           at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
           at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
           at java.lang.Float.parseFloat(Float.java:451)
           at me.nikhilchaudhari.quarks.core.ConstantsKt.roundTo(ConstantsKt.java:1)
           at me.nikhilchaudhari.quarks.particle.Particle.update(Particle.java:1)
           at me.nikhilchaudhari.quarks.emitters.ParticleExplodeEmitter.update(ParticleExplodeEmitter.java:2)
           at me.nikhilchaudhari.quarks.ParticleSystemKt$CreateParticles$2.invoke(ParticleSystemKt.java:19)
           at androidx.compose.ui.draw.DrawBackgroundModifier.draw(DrawBackgroundModifier.java:2)
           at androidx.compose.ui.node.ModifiedDrawNode.performDraw(ModifiedDrawNode.java:23)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.java:3)
           at androidx.compose.ui.node.InnerPlaceable.performDraw(InnerPlaceable.java:9)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.java:3)
           at androidx.compose.ui.node.InnerPlaceable.performDraw(InnerPlaceable.java:9)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.java:3)
           at androidx.compose.ui.node.InnerPlaceable.performDraw(InnerPlaceable.java:9)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.java:1)
           at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:47)
           at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:12)
           at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.java:6)
           at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.java:38)
           at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.java:11)
           at androidx.compose.ui.node.LayoutNodeWrapper.N0(LayoutNodeWrapper.java:9)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.LayoutNodeDrawScope.drawContent(LayoutNodeDrawScope.java:13)
           at androidx.compose.foundation.Background.draw(Background.java:9)
           at androidx.compose.ui.node.ModifiedDrawNode.performDraw(ModifiedDrawNode.java:23)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.java:3)
           at androidx.compose.ui.node.InnerPlaceable.performDraw(InnerPlaceable.java:9)
           at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.java:1)
           at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:47)
           at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:12)
           at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.java:6)
           at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.java:38)
           at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.java:11)
           at androidx.compose.ui.node.LayoutNodeWrapper.N0(LayoutNodeWrapper.java:9)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.java:1)
           at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:47)
           at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:12)
           at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.java:6)
           at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.java:38)
           at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.java:11)
           at androidx.compose.ui.node.LayoutNodeWrapper.N0(LayoutNodeWrapper.java:9)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.java:3)
           at androidx.compose.ui.node.InnerPlaceable.performDraw(InnerPlaceable.java:9)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.java:1)
           at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:47)
           at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:12)
           at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.java:6)
           at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.java:38)
           at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.java:11)
           at androidx.compose.ui.node.LayoutNodeWrapper.N0(LayoutNodeWrapper.java:9)
           at androidx.compose.ui.node.ModifiedLayoutNode.performDraw(ModifiedLayoutNode.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper$invoke$1.invoke(LayoutNodeWrapper.java:1)
           at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.java:40)
           at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.java:40)
           at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.java:12)
           at androidx.compose.ui.node.LayoutNodeWrapper.invoke(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.platform.RenderNodeApi29.record(RenderNodeApi29.java:6)
           at androidx.compose.ui.platform.RenderNodeLayer.updateDisplayList(RenderNodeLayer.java:38)
           at androidx.compose.ui.platform.RenderNodeLayer.drawLayer(RenderNodeLayer.java:11)
           at androidx.compose.ui.node.LayoutNodeWrapper.N0(LayoutNodeWrapper.java:9)
           at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.java:3)
           at androidx.compose.ui.node.InnerPlaceable.performDraw(InnerPlaceable.java:9)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.performDraw(DelegatingLayoutNodeWrapper.java:2)
           at androidx.compose.ui.node.LayoutNodeWrapper.draw(LayoutNodeWrapper.java:4)
           at androidx.compose.ui.node.LayoutNode.draw$ui_release(LayoutNode.java:9)
           at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.java:9)
           at android.view.View.draw(View.java:21443)
           at android.view.View.updateDisplayListIfDirty(View.java:20317)
           at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4372)
           at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4345)
           at android.view.View.updateDisplayListIfDirty(View.java:20277)
           at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4372)
           at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4345)
           at android.view.View.updateDisplayListIfDirty(View.java:20277)
           at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4372)
           at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4345)
           at android.view.View.updateDisplayListIfDirty(View.java:20277)
           at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4372)
           at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4345)
           at android.view.View.updateDisplayListIfDirty(View.java:20277)
           at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:575)
           at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:581)
           at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:654)
           at android.view.ViewRootImpl.draw(ViewRootImpl.java:3608)
           at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3416)
           at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2753)
           at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1719)
           at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7602)
           at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1029)
           at android.view.Choreographer.doCallbacks(Choreographer.java:852)
           at android.view.Choreographer.doFrame(Choreographer.java:787)
           at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1014)
           at android.os.Handler.handleCallback(Handler.java:883)
           at android.os.Handler.dispatchMessage(Handler.java:100)
           at android.os.Looper.loop(Looper.java:214)
           at android.app.ActivityThread.main(ActivityThread.java:7397)
           at java.lang.reflect.Method.invoke(Method.java)
           at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
    
    opened by Vivecstel 2
  • fixes #1

    fixes #1

    String format method uses Locale behind the scenes that causes crashes in some locales that use "," as a decimal separator. Changed to BigDecimal setscale function instead.

    opened by Vivecstel 0
Releases(1.0.0-alpha02)
  • 1.0.0-alpha02(Oct 12, 2021)

    • Fix issue where the issue where roundTo function was unable to parse "," because of string format exception #1

    Thanks and shoutout to @SteliosElaiotrivaris for fixing the issue

    Source code(tar.gz)
    Source code(zip)
  • 1.0.0-alpha01(Oct 3, 2021)

Owner
Nikhil Chaudhari
programming and percussions !!
Nikhil Chaudhari
A particle view library written in kotlin, easy to use

particle 中文介绍 This is a handy android library for particle effect. To start with, you need to add it in your root build.gradle at the end of repositor

null 89 Nov 14, 2022
Android.compose.squircle - Android LightWeight Squircle Library for JetPack Compose

Android LightWeight Squircle Library for JetPack Compose Usage Based on Compose

Quang Nguyen 9 Jul 5, 2022
A sample of how to implement a design system in Jetpack Compose

[WIP] Sample Design System This project aims to hold an example of how to implement a design system with Jetpack Compose. At this moment it only has t

FΓ‘bio Carballo 4 Dec 2, 2021
Customisable Preview of system UI decoration for Jetpack Compose.

AdvancedPreview Customisable Preview of system UI decoration for Jetpack Compose. Use cases Want the Preview in Android Studio to look more like in re

Mobnetic 28 Dec 5, 2022
Fake Toss Design System with Jetpack Compose

FTDS Fake Toss Design System Let's clone TDS with Jetpack Compose! TDS의 λͺ¨λ“  면을 따라

Fake Toss 1 Apr 18, 2022
Andromeda is a open-source design language system implemented in Jetpack Compose.

Andromeda Andromeda is a open-source design language system implemented in Jetpack Compose. Catalog app Table of Contents About the Project Getting St

Adit Lal 140 Dec 25, 2022
Lightweight library to tweak the fling behaviour in Android. This library is only compatible with Jetpack-Compose.

Flinger (Only compatible with compose) What is Flinger? Flinger is a plugin that is made on top of jetpack compose that will help the developer to twe

Joseph James 73 Dec 24, 2022
Holi is a lightweight Jetpack Compose library of colors, gradients and cool utility functions for all your palette needs!

Holi A library of colors, gradients and utils built using Jetpack Compose for Android Features A wide collection of colors from different palettes for

Siddhesh Patil 167 Dec 5, 2022
Holi is a lightweight Jetpack Compose library of colors, gradients and cool utility functions for all your palette needs!

Holi is a lightweight Jetpack Compose library of colors, gradients and cool utility functions for all your palette needs!

Sid Patil 167 Dec 5, 2022
A lightweight library for using Material Colors in Android Jetpack Compose Project πŸš€πŸš€πŸš€

How To Use Step 1: Add the JitPack repository to your build file. Add it in your root build.gradle / build.gradle.kts at the end of repositories: Groo

Atick Faisal 9 Sep 9, 2022