Dali is an image blur library for Android. It contains several modules for static blurring, live blurring and animations.

Overview

Dali

Dali is an image blur library for Android. It is easy to use, fast and extensible. Dali contains several modules for either static blurring, live blurring and animations. It uses RenderScript internally (although different implementations can be chosen) and is heavily cached to be fast and keeps small memory footprint. It features a lot of additional image filters and may be easily extended and pretty every configuration can be changed.

Download Build Status Javadocs Android Arsenal Maintainability

Gallery

Note: This library is in prototype state and not ready for prime time. It is mostly feature complete (except for the animation module) although bugs are to be expected.

Install

Add the following to your dependencies (add jcenter to your repositories if you haven't)

   dependencies {
        compile 'at.favre.lib:dali:0.4.0'
   }

Then add the following to your app's build.gradle to get Renderscript to work

android {
    ...
    defaultConfig {
        ...
        renderscriptTargetApi 24
        renderscriptSupportModeEnabled true
    }
}

The quickest way to discover possible features, is to see what builder methods Dali.create(context) contains.

Download Test App

Get it on Google Play

The test app is in the Playstore, you can get it here Dali Test App.

Features

Static Blur

Static blur refers to blurring images that do not change dynamically in the UI (e.g. a static background image). Dali uses the builder pattern for easy and readable configuration. A very simple example would be:

    Dali.create(context).load(R.drawable.test_img1).blurRadius(12).into(imageView);

which would blur given image in a background thread and set it to the ImageView. Dali also supports additional image manipulation filters i.e. brightness, contrast and color.

Most of them use RenderScript so they should be reasonably fast, although check compatibility. For details on the filter implementation see the at.favre.lib.dali.builder.processor package.

Any other manipulation filter can be implemented through the IBitmapProcessor and .addPreProcessor on a builder.

A more complex example including filters would be:

    Dali.create(context).load(R.drawable.test_img1).placeholder(R.drawable.test_img1).blurRadius(12)
        .downScale(2).colorFilter(Color.parseColor("#ffccdceb")).concurrent().reScale().into(iv3)

This will blur, color filter a downscaled version of given image on a concurrent thread pool and rescales it the target (the imageView) this case and will set a placeholder until the operations are finished.

Do note that Dali.create(context) will always create a new instance, so it may be advisable to keep the reference.

For more examples, see SimpleBlurFragment.java and SimpleBlurBrightnessFragment.java

Blur any View

Apart from resource ids, bitmaps, files and InputStreams .load(anyAndroidView) method also loads any View as source and blurs its drawingCache into the target view.

   		Dali.create(context).load(rootView.findViewById(R.id.blurTemplateView)).blurRadius(20)
   		    .downScale(2).concurrent().reScale().skipCache().into(imageView);

For more examples, see ViewBlurFragment.java

Skip blurring

If you want to utilize Dali's features, without blurring the image you could do:

    Dali.create(context).load(R.drawable.test_img1).algorithm(EBlurAlgorithm.NONE).brightness(70).concurrent().into(iv);

Live Blur

Live blur refers to an effect where it a portion of the view blurs what's behind it. It can be used with e.g. a ViewPager, Scrollview, RecyclerView, etc.

Live Blur Animation

A very simple example with a ViewPager would be:

    blurWorker = Dali.create(getActivity()).liveBlur(rootViewPagerWrapperView,topBlurView,bottomBlurView).downScale(8).assemble(true);

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            blurWorker.updateBlurView();
        }
        @Override public void onPageSelected(int position) {}
		@Override public void onPageScrollStateChanged(int state) {}
    });

A full example can be found in the test app's LiveBlurFragment.java

The idea is basically to hook up to the scrollable view and every scroll event the blur has to be updated with blurWorker.updateBlurView(). Many of the views do not offer these features, therefore there are simple implementations for some views (see package at.favre.lib.dali.view.Observable*)

Navigation Drawer Background Blur

A specialized version of live blur is blurring the background of a NavigationDrawer:

Blur Nav Animation

    protected void onCreate(Bundle savedInstanceState) {
        ...
		mDrawerToggle = new DaliBlurDrawerToggle(this, mDrawerLayout,
                toolbar, R.string.drawer_open, R.string.drawer_close) {

			public void onDrawerClosed(View view) {
				super.onDrawerClosed(view);
				invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
			}

			public void onDrawerOpened(View drawerView) {
				super.onDrawerOpened(drawerView);
				invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
			}
		};
		mDrawerToggle.setDrawerIndicatorEnabled(true);
		// Set the drawer toggle as the DrawerListener
		mDrawerLayout.addDrawerListener(mDrawerToggle);
        ...
	}

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		mDrawerToggle.syncState();
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		mDrawerToggle.onConfigurationChanged(newConfig);
	}

	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
		return super.onPrepareOptionsMenu(menu);
	}

A full example can be found in the test app's NavigationDrawerActivity.java

Blur Transition Animation

A simple framework for animating a static image from sharp to blur. It uses a keyframes to configure the animation:

    BlurKeyFrameManager man = new BlurKeyFrameManager();
    man.addKeyFrame(new BlurKeyFrame(2,4,0,300));
    man.addKeyFrame(new BlurKeyFrame(2,8,0,300));
    ...

then an ImageView can be animated:

    BlurKeyFrameTransitionAnimation animation = new BlurKeyFrameTransitionAnimation(getActivity(),man);
    animation.start(imageView);

Blur Animation

A full example can be found in the test app's SimpleAnimationFragment.java

The idea is from Roman Nurik's App Muzei where he explains how he does the blur transition smoothly and fast. Instead of just alpha fading the source and the final blur image he creates different keyframes with various states of blur and then fades through all those keyframes. This is a compromise between performance and image quality. See his Google+ blog post for more info.

Note: This module is not feature complete and has still terrible bugs, so use at your own risk.

Proguard

Since v0.3.1 the lib includes it's own proguard consumer rules and should work out of the box with obfuscated builds.

Advanced

How to build

Assemble the lib with the following command line call:

gradlew :dali:assemble

The .aar files can be found in the /dali/build/outputs/aar folder

Caching

TODO

  • fix animations
  • add tests

License

Copyright 2016 Patrick Favre-Bulle

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

http://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
  • Unable to publish app to playstore due to no 64-bit support

    Unable to publish app to playstore due to no 64-bit support

    Since app updates are not allowed without including 64-bit support, One of our apps using this library cannot be published to play store as this library doesnt have 64-bit supported native library files (.so). Can you fix this? References: https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html https://developer.android.com/distribute/best-practices/develop/64-bit

    bug 
    opened by mani516 6
  • How to blur view with transparent background

    How to blur view with transparent background

    Hello admin

    I use background is image. Library worked good. But I use background is transparent (#66000000). Library not work. Please help me. thank you very much

           <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/viewBlur"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="#66000000"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
    />
    

    and use

      Dali.create(this).load(pageControlProduct).blurRadius(20)
            .downScale(2).concurrent().reScale().skipCache().into(viewBlur);
    
    opened by jackyhieu1211-hn 2
  • How to blur view with transparent background

    How to blur view with transparent background

    Hello admin

    I use background is image not transparent. Library worked good. But I use background is transparent (#66000000) or background is image have background is #66000000 or image only have a color (#000000). Library not work. Please help me. thank you very much

       <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/pageControlProduct"
        android:layout_width="match_parent"
        android:layout_height="@dimen/video_controller_height"
        android:layout_gravity="bottom"
      >
    
      <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/viewBlur"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="#66000000" // or @drawable/background_product (#66000000)
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
       />
      </androidx.constraintlayout.widget.ConstraintLayout>
    

    and use

      Dali.create(this).load(pageControlProduct).blurRadius(20)
        .downScale(2).concurrent().reScale().skipCache().into(viewBlur);
    

    or

     Dali.create(this).load(R.drawable.background_product).blurRadius(25).into(viewBlur)
    
    question 
    opened by jackyhieu1211-hn 1
  • [bugfix] new TransitionDrawable memory leak

    [bugfix] new TransitionDrawable memory leak

    [bugfix] new TransitionDrawable point to old drawable array, which cause memory leak

    As we know, TransitionDrawable is a LayerDrawable which contains a array of two drawables need to do transition. But directly use old drawable to create new TransitionDrawable, let the the newly created TransitionDrawable hold a reference to the old array rather than the only drawable.

    placeholder = imageView.getDrawable();
    

    So I break the reference chain and fix like this:

                                    Drawable oldDrawable = imageView.getDrawable();
                                    if (oldDrawable != null) {
                                        if (oldDrawable instanceof LayerDrawable) {
                                            LayerDrawable oldLayerDrawable = (LayerDrawable) oldDrawable;
                                            placeholder = oldLayerDrawable.getDrawable(0);
                                        } else {
                                            placeholder = imageView.getDrawable();
                                        }
                                    } 
    

    Please review that, and I hope you may accept this pr.

    opened by buptfarmer 1
  • Could not find method renderscriptTargetApi()

    Could not find method renderscriptTargetApi()

    After adding this:

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        renderscriptTargetApi 20
        renderscriptSupportModeEnabled true
    ...
    

    gradle return error:

    Error:(22, 0) Could not find method renderscriptTargetApi() for arguments [20] on project ':app' of type org.gradle.api.Project.
    <a href="openFile:D:\Projects\Test\app\build.gradle">Open File</a>
    
    opened by Kolyall 1
  • Usage on Jetpack Compose

    Usage on Jetpack Compose

    There isn't a straightforward way to use this on Jetpack Compose yet. Could it be possible to provide a Composable component that can use the Dali library? Thank you!

    opened by ComposeDesigner 0
  • Build/Release Issue: Bintray Plugin not working

    Build/Release Issue: Bintray Plugin not working

    See: https://travis-ci.org/github/patrickfav/Dali/builds/698058500

    > Task :dali:bintrayUpload
    Task :dali:bintrayUpload in app Starting
    Caching disabled for task ':dali:bintrayUpload' because:
      Caching has not been enabled for the task
    Task ':dali:bintrayUpload' is not up-to-date because:
      Task has not declared any outputs despite executing actions.
    Gradle Bintray Plugin version: 1.8.5
    Version 'patrickfav/maven/dali/0.4.0' does not exist. Attempting to create it...
    Created version '0.4.0'.
    Uploading to https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0.pom...
    Uploaded to 'https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0.pom'.
    Uploading to https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0-javadoc.jar...
    Uploaded to 'https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0-javadoc.jar'.
    Uploading to https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0-sources.jar...
    Uploaded to 'https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0-sources.jar'.
    Uploading to https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0.aar...
    Uploaded to 'https://api.bintray.com/content/patrickfav/maven/dali/0.4.0/at/favre/lib/dali/0.4.0/dali-0.4.0.aar'.
    Task :dali:bintrayUpload in app Finished
    :dali:bintrayUpload (Thread[main,5,main]) completed. Took 16.645 secs.
    :bintrayUpload (Thread[Execution worker for ':',5,main]) started.
    > Task :bintrayUpload
    Task :bintrayUpload in app Starting
    Caching disabled for task ':bintrayUpload' because:
      Caching has not been enabled for the task
    Task ':bintrayUpload' is not up-to-date because:
      Task has not declared any outputs despite executing actions.
    Gradle Bintray Plugin version: 1.8.5
    Repository name, package name or version name are null for project: root project 'Dali'
    Task :bintrayUpload in app Finished
    :bintrayUpload (Thread[Execution worker for ':',5,main]) completed. Took 0.006 secs.
    :bintrayPublish (Thread[Execution worker for ':',5,main]) started.
    > Task :bintrayPublish FAILED
    Task :bintrayPublish in app Starting
    Caching disabled for task ':bintrayPublish' because:
      Caching has not been enabled for the task
    Task ':bintrayPublish' is not up-to-date because:
      Task has not declared any outputs despite executing actions.
    Task :bintrayPublish in app Finished
    :bintrayPublish (Thread[Execution worker for ':',5,main]) completed. Took 0.017 secs.
    FAILURE: Build failed with an exception.
    * What went wrong:
    Execution failed for task ':bintrayPublish'.
    > java.lang.NullPointerException (no error message)
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.
    * Get more help at https://help.gradle.org
    Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
    Use '--warning-mode all' to show the individual deprecation warnings.
    See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warnings
    BUILD FAILED in 32s
    30 actionable tasks: 9 executed, 21 up-to-date
    Script failed with status 1
    
    buildbug 
    opened by patrickfav 0
  • Crash when using HARDWARE bitmap

    Crash when using HARDWARE bitmap

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            GlobalScope.launch(Dispatchers.IO) {
                val url = "https://upload.wikimedia.org/wikipedia/commons/a/ad/Gretag-Macbeth_ColorChecker.jpg"
                val stream = URL(url).openStream()
                val bitmap = BitmapFactory.decodeStream(stream)
                    .copy(Bitmap.Config.HARDWARE, false)
    
                Dali.create(this@MainActivity)
                    .load(bitmap)
                    .skipCache()
                    .blurRadius(12)
                    .into(image);
            }
        }
    }
    
    2020-06-12 20:31:48.532 23211-23211/com.example.myapplication E/BlurBuilder: Could not set into imageview
        at.favre.lib.dali.builder.exception.BlurWorkerException: androidx.renderscript.RSInvalidStateException: Bad bitmap type: HARDWARE
            at at.favre.lib.dali.builder.blur.BlurWorker.process(BlurWorker.java:153)
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:48)
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:27)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
            at java.lang.Thread.run(Thread.java:798)
         Caused by: androidx.renderscript.RSInvalidStateException: Bad bitmap type: HARDWARE
            at androidx.renderscript.Allocation.elementFromBitmap(Allocation.java:2654)
            at androidx.renderscript.Allocation.typeFromBitmap(Allocation.java:2659)
            at androidx.renderscript.Allocation.createFromBitmap(Allocation.java:2696)
            at androidx.renderscript.Allocation.createFromBitmap(Allocation.java:2749)
            at at.favre.lib.dali.blur.algorithms.RenderScriptGaussianBlur.blur(RenderScriptGaussianBlur.java:24)
            at at.favre.lib.dali.builder.blur.BlurWorker.process(BlurWorker.java:129)
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:48) 
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:27) 
            at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
            at java.lang.Thread.run(Thread.java:798) 
    
    bug help wanted 
    opened by diegor2 4
  • The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS

    The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS

    Installation did not succeed. The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS Installation failed due to: 'null'

    how can i fix this ?

    bug 
    opened by AnthonyKoueik 1
  • Failed resolution of: Lcom/jakewharton/disklrucache/DiskLruCache;

    Failed resolution of: Lcom/jakewharton/disklrucache/DiskLruCache;

    ~~Might be related to #14~~

    Code

    Dali.create(this).load(R.drawable.ic_launcher_background).blurRadius(10).into(imgBackground)
    

    Stacktrace

    2019-07-26 16:55:46.462 31292-31292/com.marknjunge.blurryshadow E/BlurBuilder: Could not set into imageview
        at.favre.lib.dali.builder.exception.BlurWorkerException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/jakewharton/disklrucache/DiskLruCache;
            at at.favre.lib.dali.builder.blur.BlurWorker.process(BlurWorker.java:153)
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:48)
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:27)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
            at java.lang.Thread.run(Thread.java:764)
         Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/jakewharton/disklrucache/DiskLruCache;
            at at.favre.lib.dali.builder.TwoLevelCache.getDiskCache(TwoLevelCache.java:72)
            at at.favre.lib.dali.builder.TwoLevelCache.getFromDiskCache(TwoLevelCache.java:147)
            at at.favre.lib.dali.builder.TwoLevelCache.get(TwoLevelCache.java:97)
            at at.favre.lib.dali.builder.blur.BlurWorker.process(BlurWorker.java:73)
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:48) 
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:27) 
            at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
            at java.lang.Thread.run(Thread.java:764) 
         Caused by: java.lang.ClassNotFoundException: Didn't find class "com.jakewharton.disklrucache.DiskLruCache" on path: DexPathList[[zip file "/data/app/com.marknjunge.blurryshadow-Vc6sW-Lf0gDW7QCdqIz8GA==/base.apk"],nativeLibraryDirectories=[/data/app/com.marknjunge.blurryshadow-Vc6sW-Lf0gDW7QCdqIz8GA==/lib/arm, /data/app/com.marknjunge.blurryshadow-Vc6sW-Lf0gDW7QCdqIz8GA==/base.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:169)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
            at at.favre.lib.dali.builder.TwoLevelCache.getDiskCache(TwoLevelCache.java:72) 
            at at.favre.lib.dali.builder.TwoLevelCache.getFromDiskCache(TwoLevelCache.java:147) 
            at at.favre.lib.dali.builder.TwoLevelCache.get(TwoLevelCache.java:97) 
            at at.favre.lib.dali.builder.blur.BlurWorker.process(BlurWorker.java:73) 
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:48) 
            at at.favre.lib.dali.builder.blur.BlurWorker.call(BlurWorker.java:27) 
            at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
            at java.lang.Thread.run(Thread.java:764) 
    
    bug help wanted 
    opened by MarkNjunge 6
Releases(v0.4.0)
Owner
Patrick Favre-Bulle
Computer Science MSc @ TUWien 2015. Going through the stack: JS Frontend, Android Mobile, Spring/Kotlin type backend. Interested in most topics cryptography
Patrick Favre-Bulle
A Jetpack Compose library with blur, pixelate, and other effects to keep your designer happy. Inspired by iOS UIVisualEffectView.

A Jetpack Compose library with blur, pixelate, and other effects to keep your designer happy. Inspired by iOS UIVisualEffectView.

清茶 67 Dec 30, 2022
Library for creating blur effects under Android UI elements

BlurTutorial Meet BlurTutorial, an Android-based library made by Cleveroad Hurry to check our newest library that helps to blur the background in Andr

Cleveroad 150 Dec 16, 2022
JetCompose - Blur Effect in Android 12 with motion layout carousel

JetCompose Blur Effect in Android 12 with motion layout carousel

Vikas Singh 4 Jul 27, 2022
A cool Open Source CoverFlow view for Android with several fancy effects.

FancyCoverFlow THIS PROJECT IS NO LONGER MAINTAINED! What is FancyCoverFlow? FancyCoverFlow is a flexible Android widget providing out of the box view

David Schreiber-Ranner 1.1k Nov 10, 2022
IconicDroid is a custom Android Drawable which allows to draw icons from several iconic fonts.

IconicDroid IconicDroid is a custom Android Drawable which allows to draw icons from several iconic fonts. Try out the sample application on the Googl

Artur Termenji 387 Nov 20, 2022
TourGuide is an Android library that aims to provide an easy way to add pointers with animations over a desired Android View

TourGuide TourGuide is an Android library. It lets you add pointer, overlay and tooltip easily, guiding users on how to use your app. Refer to the exa

Tan Jun Rong 2.6k Jan 5, 2023
Android View for displaying and selecting values in a circle-shaped View, with animations and touch gestures.

CircleDisplay Android View for displaying and selecting (by touch) values / percentages in a circle-shaped View, with animations. Features Core featur

Philipp Jahoda 287 Nov 18, 2022
Material Design implementation for Android 4.0+. Shadows, ripples, vectors, fonts, animations, widgets, rounded corners and more.

Carbon Material Design implementation for Android 4.0 and newer. This is not the exact copy of the Lollipop's API and features. It's a custom implemen

null 3k Dec 30, 2022
:balloon: A lightweight popup like tooltips, fully customizable with an arrow and animations.

Balloon ?? A lightweight popup like tooltips, fully customizable with arrow and animations. Including in your project Gradle Add below codes to your r

Jaewoong Eum 2.8k Jan 5, 2023
A material Switch with icon animations and color transitions

Material Animated Switch A material Switch with icon animations and color transitions Sample video: Youtube Material Animated Switch video Sample app:

Adrián Lomas 1.2k Dec 29, 2022
A beautiful Android custom View that works similar to a range or seekbar. With animations.

ValueBar A beautiful Android custom View that works similar to a range or seekbar. Selection by gesture. With animations. Supporting API level 11+. De

Philipp Jahoda 147 Nov 20, 2022
Code Guide: How to create Snapchat-like image stickers and text stickers.

MotionViews-Android Code Guide : How to create Snapchat-like image stickers and text stickers After spending 2000+ hours and releasing 4+ successful a

Uptech 474 Dec 9, 2022
It is a Profile Image View with percentage progress developed in Kotlin.

It is a Profile Image View with percentage progress developed in Kotlin. It is a highly customizable view that offers multiple attributes for creating either dash or continuous progress view around profile image based on your requirements.

smartSense Solutions 16 Jun 23, 2022
ProfilePercentageView - A Profile Image View with percentage progress developed in Kotlin

ProfilePercentageView It is a Profile Image View with percentage progress develo

smartSense Solutions 8 Dec 31, 2021
A new canvas drawing library for Android. Aims to be the Fabric.js for Android. Supports text, images, and hand/stylus drawing input. The library has a website and API docs, check it out

FabricView - A new canvas drawing library for Android. The library was born as part of a project in SD Hacks (www.sdhacks.io) on October 3rd. It is cu

Antwan Gaggi 1k Dec 13, 2022
Android StackBlur is a library that can perform a blurry effect on a Bitmap based on a gradient or radius, and return the result. The library is based on the code of Mario Klingemann.

Android StackBlur Android StackBlur is a library that can perform a blurry effect on a Bitmap based on a gradient or radius, and return the result. Th

Enrique López Mañas 3.6k Dec 29, 2022
Simple and lightweight UI library for user new experience, combining floating bottom navigation and bottom sheet behaviour. Simple and beautiful.

Simple and lightweight UI library for user new experience, combining floating bottom navigation and bottom sheet behaviour. Simple and beautiful.

Rizki Maulana 118 Dec 14, 2022
Android library providing bread crumbs to the support library fragments.

Hansel And Gretel Android library providing bread crumbs for compatibility fragments. Usage For a working implementation of this project see the sampl

Jake Wharton 163 Nov 25, 2022
Janishar Ali 2.1k Jan 1, 2023