create your custom themes and change them dynamically with ripple animation

Overview

Android Animated Theme Manager Tweet

License Maven Central Generic badge Generic badge Generic badge CodeFactor Quality Gate Status

create your custom themes and change them dynamically with ripple animation

animation-ripple-android-theme

Features

  • support java and kotlin projects.
  • change theme without recreating activities and fragments.
  • support muli fragments apps.
  • ripple animation.
  • reverse animation.
  • changeable animation duration.
  • changeable animation position.
  • animation listener.
  • observe changes of themes for custom actions with Livedata.
  • easy to use, 5 or 7 tiny steps.
  • support any android APIs (animation works on API>20).


How to install? Maven Central

add the following line to app-level build.gradle file, in dependencies scope:

dependencies {
    ...
    implementation "io.github.imandolatkia:animatedThemeManager:1.1.2"
}

How to use?

1- create an abstract class that inherits from AppTheme. in this class create abstract methods to return related color for all UI element that you want to change them on each theme. for example, if you want to change the background color, text colors and icon colors in your firstActivity, do this:

interface MyAppTheme : AppTheme {
    fun firstActivityBackgroundColor(context: Context): Int
    fun firstActivityTextColor(context: Context): Int
    fun firstActivityIconColor(context: Context): Int
    // any other methods for other elements
}
java

interface MyAppTheme extends AppTheme {
    int firstActivityBackgroundColor(@NotNull Context context);
    int firstActivityTextColor(@NotNull Context context);
    int firstActivityIconColor(@NotNull Context context);
    // any other methods for other elements
}

2- for each theme that you want in your app, create a class that extends from the class that was created in step 1 (MyAppTheme), and implement methods with related colors or resources, for example, if you want to have 3 themes, you should create 3 class and implement methods:

class LightTheme : MyAppTheme {

    override fun id(): Int { // set unique iD for each theme 
        return 0
    }

    override fun firstActivityBackgroundColor(context: Context): Int {
        return ContextCompat.getColor(context, R.color.background_light)
    }

    override fun firstActivityTextColor(context: Context): Int {
        return ContextCompat.getColor(context, R.color.text_light)
    }
    
     override fun firstActivityIconColor(context: Context): Int {
        return ContextCompat.getColor(context, R.color.icon_light)
    }
    
    ...
}

class NightTheme : MyAppTheme {...}
class PinkTheme : MyAppTheme {...}
java

public class LightTheme implements MyAppTheme {
    public int id() { // set unique iD for each theme 
        return 0;
    }

    public int firstActivityBackgroundColor(@NotNull Context context) {
        return ContextCompat.getColor(context, R.color.background_light);
    }

    public int firstActivityTextColor(@NotNull Context context) {
        return ContextCompat.getColor(context,  R.color.text_light);
    }

    public int firstActivityIconColor(@NotNull Context context) {
        return ContextCompat.getColor(context, R.color.icon_light);
    }
    
    ...
}
    
public class NightTheme implements MyAppTheme {...}
public class PinkTheme implements MyAppTheme {...}

3- extends your activity from ThemeActivity:

MainActivity : ThemeActivity() {
...
}
java

public class MainActivity implements ThemeActivity {
...
}

4- implement ThemeActivity 2 abstract methods:

// to sync ui with selected theme
override fun syncTheme(appTheme: AppTheme) {
    // change ui colors with new appThem here

    val myAppTheme = appTheme as MyAppTheme
    // set background color
    binder.root.setBackgroundColor(myAppTheme.firstActivityBackgroundColor(this))

    //set text color
    binder.text.setTextColor(myAppTheme.activityTextColor(this))
        
    // set icons color
    binder.share.setColorFilter(myAppTheme.firstActivityIconColor(this))
    binder.gift.setColorFilter(myAppTheme.firstActivityIconColor(this))        
    ...
}

// to get start theme
override fun getStartTheme(): AppTheme {
    return LightTheme()
}
java

// to sync ui with selected theme
@Override
public void syncTheme(@NotNull AppTheme appTheme) {
    // change ui colors with new appThem here

    MyAppTheme myAppTheme = (MyAppTheme) appTheme;

    // set background color
    binder.getRoot().setBackgroundColor(myAppTheme.activityBackgroundColor(this));

    //set text color
    binder.text.setTextColor(myAppTheme.activityTextColor(this));

    // set icons color
    binder.share.setColorFilter(myAppTheme.activityBackgroundColor(this));
    binder.gift.setColorFilter(myAppTheme.activityBackgroundColor(this));
}

// to get start theme
@NotNull
@Override
public AppTheme getStartTheme() {
    return new LightTheme();
}

5- change theme from user click with ThemeManager.instance.changeTheme() method:

// set change theme click listener
binder.lightButton.setOnClickListener {
  ThemeManager.instance.changeTheme(LightTheme(), it)
}
java

binder.lightButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      ThemeManager.Companion.getInstance().changeTheme(new LightTheme(), v, 600);
    }
});

the first argument is the selected theme.

the second argument is the view that animation starts from the center of it.

How to use in multi fragments app?

repeat all previous 5 steps, and then:

6- extends your fragments from ThemeFragment:

MyFragment : ThemeFragment() {
...
}
java

public class MyFragment implements ThemeFragment {
...
}

7- implement ThemeFragment syncTheme abstract methods:

// to sync ui with selected theme
override fun syncTheme(appTheme: AppTheme) {
    // change ui colors with new appThem here
    ...
}
java

@Override
public void syncTheme(@NotNull AppTheme appTheme) {
    // change ui colors with new appThem here
    ...
}

Some other settings and customization:

✔️ reverse animation

if you want to use reverse animation, call reverseChangeTheme() instead of changeTheme():

   binder.lightButton.setOnClickListener {
        ThemeManager.instance.reverseChangeTheme(LightTheme(), it)
   }

reverse ripple theme animation

✔️ change animation duration

if you want to change animation duration, add your desire duration in millisecond as the third argument of ThemeManager.instance.changeTheme(). the default value is 600:

   binder.lightButton.setOnClickListener {
        ThemeManager.instance.changeTheme(LightTheme(), it, 800)
   }

✔️ change animation center position

if you want to start animation somewhere other than the view that clicked, send a Coordinate object instead of View in ThemeManager.instance.changeTheme()

   binder.lightButton.setOnClickListener {
          binder.nightButton.setOnClickListener {
            ThemeManager.instance.changeTheme(NightTheme(), Coordinate(10, 20)
        }
   }

witch the Coordinate is:

 Coordinate(var x: Int, var y: Int) 

✔️ observe changes of themes yourself

if you want to observe changes of themes and do some custom action, you can use theme Livedata in any fragment or activity:

    ThemeManager.instance.getCurrentLiveTheme().observe(this) {
        Toast.makeText(this, "on Theme changed to ${it.id()}", Toast.LENGTH_SHORT).show()
    }

✔️ set animation listener

if you want to set animation listener, use setThemeAnimationListener() method in your activity

     setThemeAnimationListener(MyThemeAnimationListener(this))

witch the MyThemeAnimationListener is:

    class MyThemeAnimationListener(var context: Context) : ThemeAnimationListener{
        override fun onAnimationStart(animation: Animator) {
           Toast.makeText(context, "onAnimationStart", Toast.LENGTH_SHORT).show()
        }

        override fun onAnimationEnd(animation: Animator) {
            Toast.makeText(context, "onAnimationEnd", Toast.LENGTH_SHORT).show()
        }

        override fun onAnimationCancel(animation: Animator) {
            Toast.makeText(context, "onAnimationCancel", Toast.LENGTH_SHORT).show()
        }

        override fun onAnimationRepeat(animation: Animator) {
            Toast.makeText(context, "onAnimationRepeat", Toast.LENGTH_SHORT).show()
        }
    }

Stargazers

Stargazers repo roster for @imandolatkia/Android-Animated-Theme-Manager

Forkers

Forkers repo roster for @imandolatkia/Android-Animated-Theme-Manager

Quality gate

Comments
  • Optimize layout.

    Optimize layout.

    Create ThemeActivity's layout in the code. This should be faster than inflating an XML file.

    The light version of ImageView can be used as we don't do scaling or resizing of bitmap.

    opened by pelmenstar1 3
  • Code refactoring

    Code refactoring

    Following are the changes:

    • companion object was not needed as an instance of ThemeManager can be created from outside
    • The base activity is lazy creating their own instance of ThemeManager
    • The base fragment is referring base activity to get hold of the ThemeManager by lazy
    • Child classes of the activity and fragment can access the ThemeManager by calling getThemeManager()
    • Kotlin version updated
    • jcenter() has been replaced with mavenCentral()
    • versionName and versionCode added to the library
    • Java 8 support has been added in the gradle
    opened by wwdablu 3
  • Sync status and navigation bar color with WindowInsetsController

    Sync status and navigation bar color with WindowInsetsController

    🚀 Description

    Sync status and navigation bar color with WindowInsetsController on Device which api >= 30

    📄 Motivation and Context

    Compact higher Api

    🧪 How Has This Been Tested?

    Tested on Api 30

    📷 Screenshots (if appropriate)

    📦 Types of changes

    • [ ] Bug fix (non-breaking change which fixes an issue)
    • [ ] New feature (non-breaking change which adds functionality)
    • [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)

    ✅ Checklist

    • [x] My code follows the code style of this project.
    • [ ] My change requires a change to the documentation.
    • [ ] I have updated the documentation accordingly.
    opened by lwj1994 2
  • Activity theme

    Activity theme

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.samprojre/com.example.samprojre.screens.main.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. Currently, I am using Theme.Material3.Light.NoActionBar as a style for MainActivity and I didn't have that exception before when I extended MainActivity from AppCompatActivity

    opened by krutzzz 1
  • Cannot start anim on deAttachedView

    Cannot start anim on deAttachedView

    java.lang.IllegalStateException: Cannot start this animator on a detached view!
    

    When i click change theme button, all working good but when i open any acivity and go back then click, and crashed

    opened by RohitVerma882 1
  • The specified child already has a parent exception at setContentView

    The specified child already has a parent exception at setContentView

    My code works fine if my activity extends from AppCompatActivity, but I got this exception when extends ThemeActivity

    Process: com.example.todoapp, PID: 5708
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.todoapp/com.example.todoapp.MainActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loop(Looper.java:223)
            at android.app.ActivityThread.main(ActivityThread.java:7656)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
         Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
            at android.view.ViewGroup.addViewInner(ViewGroup.java:5235)
            at android.view.ViewGroup.addView(ViewGroup.java:5064)
            at android.view.ViewGroup.addView(ViewGroup.java:5004)
            at android.view.ViewGroup.addView(ViewGroup.java:4976)
            at com.dolatkia.animatedThemeManager.ThemeActivity.setContentView(ThemeActivity.kt:59)
            at com.dolatkia.animatedThemeManager.ThemeActivity.setContentView(ThemeActivity.kt:54)
            at com.example.todoapp.MainActivity.onCreate(MainActivity.kt:27)
            at android.app.Activity.performCreate(Activity.java:8000)
            at android.app.Activity.performCreate(Activity.java:7984)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
            at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loop(Looper.java:223) 
            at android.app.ActivityThread.main(ActivityThread.java:7656) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
    

    My MainActivity.kt

    package com.example.todoapp
    
    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import androidx.drawerlayout.widget.DrawerLayout
    import com.dolatkia.animatedThemeManager.AppTheme
    import com.dolatkia.animatedThemeManager.ThemeActivity
    import com.dolatkia.animatedThemeManager.ThemeManager
    import com.google.android.material.appbar.MaterialToolbar
    import com.google.android.material.navigation.NavigationView
    
    class MainActivity : ThemeActivity() {
    
        private lateinit var drawerLayout: DrawerLayout
        private lateinit var topAppBar: MaterialToolbar
        private lateinit var navigationView: NavigationView
    
        override fun getStartTheme(): AppTheme {
            return LightTheme()
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            setContentView(R.layout.activity_main)             // I GOT EXCEPTION HERE
    
            // Views
            drawerLayout = findViewById(R.id.drawer)
            topAppBar = findViewById(R.id.topAppBar)
            navigationView = findViewById(R.id.navigation_view)
    
            supportFragmentManager.beginTransaction().replace(R.id.fragment_container, MainFragment()).commit()
    
            topAppBar.setNavigationOnClickListener {
                drawerLayout.open()
            }
    
            navigationView.setNavigationItemSelectedListener { menuItem ->
                if (menuItem.isChecked) {
                    false
                } else {
                    // Handle menu item selected
                    when (menuItem.itemId) {
                        R.id.nav_main -> supportFragmentManager.beginTransaction().replace(R.id.fragment_container, MainFragment()).commit()
                        R.id.nav_about -> supportFragmentManager.beginTransaction().replace(R.id.fragment_container, AboutFragment()).commit()
                    }
    
                    menuItem.isChecked = true
                    drawerLayout.close()
                    false
                }
            }
        }
    
        override fun syncTheme(appTheme: AppTheme) {
            val myAppTheme = appTheme as MyAppTheme
    
            drawerLayout.rootView.setBackgroundColor(myAppTheme.firstActivityBackgroundColor(this))
        }
    }
    

    My activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true">
    
            <com.google.android.material.appbar.AppBarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/Widget.MaterialComponents.ActionBar.PrimarySurface"
                android:fitsSystemWindows="true">
                
                <com.google.android.material.appbar.MaterialToolbar
                    android:id="@+id/topAppBar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:title="Main"
                    app:navigationIcon="@drawable/ic_baseline_menu_24"
                    style="@style/Widget.MaterialComponents.ActionBar.PrimarySurface"
                    android:background="@android:color/transparent"
                    android:elevation="0dp" />
    
    
            </com.google.android.material.appbar.AppBarLayout>
    
            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/fragment_container"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
        </androidx.coordinatorlayout.widget.CoordinatorLayout>
    
        <com.google.android.material.navigation.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:menu="@menu/navigation_drawer" />
    
    
    </androidx.drawerlayout.widget.DrawerLayout>
    

    Can you help me get through this. Anyway thank you for an amazing library (sorry for my bad english)

    opened by longnh-uit 0
  • RecyclerView

    RecyclerView

    Hi @imandolatkia ! First of all I have to say that this library is AMAZING, this just save my life really!!

    Could you explain how to implement this feature in a recycler? You said this a long time ago but I can´t se any related video :octocat:

    HI @SudoDios, It's a really good question.

    1- You should synchronize the RecyclerView theme in Viewholders. I mean in the RecyclerView adapter and inonBindViewHolder method, with the use of ThemeManager. 2- After the theme is changed, if the fragment that contained RecyclerView was displaying, call notifyDataSetChanged() from its adapter.

    I will add the sample in a week.

    Thanks a lot !!! And again, very good job !!!

    opened by Ufransa 3
  • Cannot start animation on a detached view  for a resumed Activity.

    Cannot start animation on a detached view for a resumed Activity.

    Although I easily fixed this issue, the solution should be included in the next update.

    I'd give a bit of context on why this happened and how to recreate the problem.

    I have a base class BaseActivity which extends ThemeActivity. All my Activity classes extend BaseActivity and so can override syncTheme() and getStartTheme().

    Let's say I start from MainActivity which extends BaseActivity and in it's onCreate() it calls ThemeManager.init(activity, getStartTheme()). This happens from the ThemeActivity super class.

    However when I navigate to another class say SecondActivity, this is what happens.

    • onStop() of MainActivity is called.
    • onCreate() of SecondActivity is called and this is where the ThemeManager instance is initialized again (from the super class ThemeActivity) and changes private activity variable from MainActivity to SecondActivity. This is fine as the current Context would be SecondActivity.

    But when I navigate back to MainActivity, this is what happens.

    • onStop() for SecondActivity is called.
    • onRestart() for MainActivity is called. Since the MainActivity is not destroyed and remained on the heap, it just stopped and restarted. It's onCreate() was not called and that means the activity variable in the ThemeManager instance that was reinstantiated when SecondActivity was navigated to still has the private activity variable as the SecondActivity instance (which should have been destroyed when navigated back up). This is a resource leak.

    And so whenever I try to change theme in MainActivity, I get a "Cannot run animation on a detached View" error from the ViewAnimator.

    I fixed this error by reinstantiating ThemeManager by calling ThemeManager.init(activity, getStartTheme()) in the onRestart() of MainActivity and that fixed my issue.

    So I feel onRestart() should be overriden in ThemeActivity and ThemeManager should reinstantiated on that callback.

    I did a debug on my code when carrying out the above scenario and found that issue out.

    opened by IODevBlue 0
  • Java How to use? something missing?

    Java How to use? something missing?

    I try to add this using java. but suddenly i saw "binder.root." what is this? How can i syncTheme in java? i think this is important but you missing explanation???

    opened by webwayscript 1
  • Improved and Updated Code

    Improved and Updated Code

    🚀 Description

    This PR contains multiple changes.

    • ThemeManager class has been changed to an object (as it has been used in an object like way before).
    • Previous ThemeManager had a potential memory leak of the activity, this has been fixed by wrapping it in a WeakReference.
    • ThemeActivity had potential memory leaks of views, this has been fixed.
    • Fragments can pass the layout in their constructor which partly fixes #14 (I don't think the same thing is possible for activities)
    • LiveData containing the theme has been changed to a StateFlow for more flexibility
    • Added @JvmOverloads on some functions for better Java compatibility
    • Replaced some get methods with final variables and getter

    📄 Motivation and Context

    • Fixes some potential memory leaks.
    • Improved flexibility, usage and compatibility

    I've made those changes because it was not nice to use with unnecessary get methods and depending on LiveData as it's not flexible enough for my usecase. Additionally I could not pass the layout inside the Fragment constructor what I normally do #14.

    🧪 How Has This Been Tested?

    I've tested it using an emulator, opend every activity and navigated further (e.g. next activity or next fragment). No crash occurred and it works as expected.

    📦 Types of changes

    • [x] Bug fix (non-breaking change which fixes an issue) Fixed memory leaks

    • [x] New feature (non-breaking change which adds functionality) Pass layout in Fragment constructor and overload functions for Java

    • [x] Breaking change (fix or feature that would cause existing functionality to not work as expected) Replaced LiveData with Flow and replaced some methods with variables ThemeManager is an object now what means no instance call on it

    ✅ Checklist

    • [x] My code follows the code style of this project.
    • [x] My change requires a change to the documentation.
    • [ ] I have updated the documentation accordingly.
    opened by DATL4G 1
  • Pass layout in activity constructor

    Pass layout in activity constructor

    ⚠️ Is your feature request related to a problem? Please describe

    I'm normally using a viewbinding library to simplify the process and prevent memory leaks. ViewBindingPropertyDelegate

    The library wants me to pass the layout in the activity constructor as described in the README. This makes it impossible to use with this Theme-Manager.

    💡 Describe the solution you'd like

    It would be nice if this library were compatible with ViewBindingPropertyDelegate and the best option for this would be if it's possible to pass the layout in the constructor.

    🤚 Do you want to develop this feature yourself?

    • [ ] Yes
    • [x] No
    opened by DATL4G 3
  • BottomSheetBehavior

    BottomSheetBehavior

    I create a bottomsheetbehavior and add inside a recyclerview contains theme list. But i click item recyclerview to change theme ThemeManager animated theme on over bottomsheet and bottomsheet has Gone.

    opened by SudoDios 1
Releases(1.1.2)
Owner
Iman Dolatkia
Android Lover
Iman Dolatkia
A beautiful ripple animation for your app

Android Ripple Background A beautiful ripple animation for your app. You can easily change its color, speed of wave, one ripple or multiple ripples. S

Yao Yu 2.2k Dec 31, 2022
Android L Ripple effect wrapper for Views

Material Ripple Layout Ripple effect wrapper for Android Views Including in your project compile 'com.balysv:material-ripple:1.0.2' Check for latest v

Balys Valentukevicius 2.3k Dec 29, 2022
Implementation of Ripple effect from Material Design for Android API 9+

RippleEffect ExpandableLayout provides an easy way to create a view called header with an expandable view. Both view are external layout to allow a ma

Robin Chutaux 4.9k Dec 30, 2022
DuGuang 1k Dec 14, 2022
PaintableVectorView enables to change color of paths/groups in Vector Drawable (SVG)

PaintableVectorView PaintableVectorView enables to change color of paths/groups in Vector Drawable (SVG) Demo Car icon made by Prosymbols from www.fla

Jakub Anioła 164 Dec 16, 2022
Android Animation Easing Functions. Let's make animation more real!

Android Easing Functions This project is originally from my another project, AndroidViewAnimation, which is an animation collection, to help you make

代码家 2.5k Jan 4, 2023
ArcAnimator helps to create arc transition animation: 2.3.+

ArcAnimator ArcAnimator helps to create arc transition animation: 14+ | ArcAnimator Demo | TransitionLoop Demo* *TransitionLoop Prototype by Min-Sang

Asyl Isakov 1.2k Dec 20, 2022
Android library to control Transition animates. A simple way to create a interactive animation.

TransitionPlayer Android library to control Transition animates. A simple way to create a interactive animation. Demo1 SimpleTransition Code: ....

林法鑫 1.2k Dec 17, 2022
Android library to control Transition animates. A simple way to create a interactive animation.

TransitionPlayer Android library to control Transition animates. A simple way to create a interactive animation. Demo1 SimpleTransition Code: ....

林法鑫 1.2k Dec 17, 2022
This is a simple util to create Activity transition animation

TransitionHelper This is a simple util to create Activity transition animation API compatible with Android 2.2+ 中文说明 Screenshots How to use 1.startAct

ImmortalZ 1.6k Dec 12, 2022
Android Library to create Lottie animation view dialog easily with a lot of customization

LottieDialog Android Library to create Lottie animation view dialog easily with a lot of customization Why you should use Lottie Dialog You have no li

Amr Hesham 39 Oct 7, 2022
Android Library to create Lottie animation view dialog easily with a lot of customization

Android Library to create Lottie animation view dialog easily with a lot of customization

Amr Hesham 39 Oct 7, 2022
A custom smooth graph with animation

SmoothGraph A custom smooth graph with animation. Intall in progress... Sample of using in activity_main.xml <app.vazovsky.smoothgraph.SmoothGraphV

vazovsky 0 Dec 12, 2021
A lightweight android library that allows to you create custom fast forward/rewind animations like on Netflix.

SuperForwardView About A lightweight android library that allows to you create custom fast forward/rewind animations like on Netflix. GIF Design Credi

Ertugrul 77 Dec 9, 2022
Chandrasekar Kuppusamy 799 Nov 14, 2022
Custom-view-animated-file-downloader - Custom Views, Animations, Broadcast Receivers, Notifications

Downloader App Custom views , Drawing with Canvas, Animations (with motionlayout

null 2 Jun 24, 2022
FadingToolbar is an animation library which fades out your footer view in a ScrollView/RecyclerView and fades in a toolbar title

FadingToolbar is an animation library which fades out your footer view in a ScrollView/RecyclerView and fades in a toolbar title (analogue of the LargeTitle animation in iOS)

Hanna 9 Nov 3, 2022
Road Runner is a library for android which allow you to make your own loading animation using a SVG image

Road Runner Road Runner is a library for android which allow you to make your own loading animation using a SVG image Sample video View in Youtube Dem

Adrián Lomas 1.2k Nov 18, 2022
A Simple Todo app design in Flutter to keep track of your task on daily basis. Its build on BLoC Pattern. You can add a project, labels, and due-date to your task also you can sort your task on the basis of project, label, and dates

WhatTodo Life can feel overwhelming. But it doesn’t have to. A Simple To-do app design in flutter to keep track of your task on daily basis. You can a

Burhanuddin Rashid 1k Jan 1, 2023