• Stars
    star
    803
  • Rank 56,759 (Top 2 %)
  • Language
    Kotlin
  • Created about 4 years ago
  • Updated about 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

πŸ­πŸš€πŸ’— Tutorials about animations with Animators, Animated Vector Drawables, Shared Transitions, and more

πŸ­πŸš€πŸ’— Animation Tutorials

Android Weekly #437 Kotlin Version API

Tutorials about animations in Android such as ObjectAnimators, ValueAnimators, translations, gradient animations, AnimationDrawables, AnimatedVectorDrawables with states, physics animations, fragment transitions, image to ViewPager transitions and more.

Overview

  • Tutorial1-1Basics
    Tutorials about animators, animation basics and using coroutine based SurfaceView to create a counter up down motion
Ch2-3 Circular Reveal Ch2-4 Rotate X/Y Flip Ch2-6 Zoom
Ch2-7 Gradient Ch2-8 Counter TextViews Ch2-9 Counter SurfaceView
Ch3-1 Physics Ch3-2 Scale and Chained Ch3-3 Fling Ch3-4 BNV+TabLayout Physics Ch3-5 Elastic Scale

Ch1-1 Animated VDs Ch1-2 State Change Ch1-3 BNV Icons
Ch1-2 RV Transition Ch1-4 RV to VP2 Transition Ch2-5/1 Nav Components
Ch2-5/2 Nav Components Ch2-5/3 Nav Components Ch2-6/1 Material Transitions

Physics Based Animations

Physics-based motion is driven by force. Spring force is one such force that guides interactivity and motion. A spring force has the following properties: damping and stiffness. In a spring-based animation, the value and the velocity are calculated based on the spring force that are applied on each frame.

If you'd like your app's animations to slow down in only one direction, consider using a friction-based fling animation instead.

Build a spring animation

The general steps for building a spring animation for your application are as follows:

  • Add the support library You must add the support library to your project to use the spring animation classes.
  • Create a spring animation: The primary step is to create an instance of the SpringAnimation class and set the motion behavior parameters.
  • (Optional) Register listeners: Register listeners to watch for animation lifecycle changes and animation value updates.

Note: Update listener should be registered only if you need per-frame update on the animation value changes. An update listener prevents the animation from potentially running on a separate thread.

  • (Optional) Remove listeners: Remove listeners that are no longer in use.
  • (Optional) Set a start value: Customize the animation start value.
  • (Optional) Set a value range: Set the animation value range to restrain values within the minimum and the maximum range.
  • (Optional) Set start velocity: Set the start velocity for the animation.
  • (Optional) Set spring properties: Set the damping ratio and the stiffness on the spring.
  • (Optional) Create a custom spring: Create a custom spring in case you do not intend to use the default spring or want to use a common spring throughout the animation.
  • Start animation: Start the spring animation.
  • (Optional) Cancel animation: Cancel the animation in case the user abruptly exits the app or the view becomes invisble.

Drawable Animations

XML for the VectorDrawable containing properties to be animated

A VectorDrawable can be represented in xml with

<vector xmlns:android="http://schemas.android.com/apk/res/android"
      android:height="64dp"
      android:width="64dp"
      android:viewportHeight="600"
      android:viewportWidth="600" >
      <group
          android:name="rotationGroup"
          android:pivotX="300.0"
          android:pivotY="300.0"
          android:rotation="45.0" >
          <path
              android:name="v"
              android:fillColor="#000000"
              android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
      </group>
  </vector>

where width and height are the actual dimensions of while viewportWidth, and viewportHeight are used for drawing coordinates.

M(x,y) Begin a new subpath by moving to (x,y).

L(x,y) Draw a line to (x,y).

C (x1,y1 x2,y2 x,y) Draw a cubic bezier curve to (x,y) using control points (x1,y1) and (x2,y2).

Z Close the path by drawing a line back to the beginning of the current subpath

group tag is used for grouping sections of drawable to be able to be animated together. And some animations such as rotation, and translation can only be applied to groups.

Animations can be performed on the animatable attributes in android.graphics.drawable.VectorDrawable. These attributes will be animated by android.animation.ObjectAnimator. The ObjectAnimator's target can be the root element, a group element or a path element. The targeted elements need to be named uniquely within the same VectorDrawable. Elements without animation do not need to be named.

For more details you can check out here

XML for AnimatedVectorDrawable

An AnimatedVectorDrawable element has a VectorDrawable attribute, and one or more target element(s). The target element can specify its target by android:name attribute, and link the target with the proper ObjectAnimator or AnimatorSet by android:animation attribute.

πŸ”₯😍 ShapeShifter by Alex Lockwood makes it so easy to create animations for Vector Drawables. Wonderful and very easy to use tool to create Animated Vector Drawables.

XML for Animations defined using ObjectAnimator or AnimatorSet

<set xmlns:android="http://schemas.android.com/apk/res/android">
      <objectAnimator
          android:duration="3000"
          android:propertyName="pathData"
          android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
          android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
          android:valueType="pathType"/>
</set>

Define an AnimatedVectorDrawable all in one XML file

Since the AAPT tool supports a new format that bundles several related XML files together, we can merge the XML files from the previous examples into one XML file:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
                   xmlns:aapt=&quothttp://schemas.android.com/aapt" >
      <aapt:attr name="android:drawable">
          <vector
              android:height="64dp"
              android:width="64dp"
              android:viewportHeight="600"
              android:viewportWidth="600" >
              <group
                  android:name="rotationGroup"
                  android:pivotX="300.0"
                  android:pivotY="300.0"
                  android:rotation="45.0" >
                  <path
                      android:name="v"
                      android:fillColor="#000000"
                      android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
              </group>
          </vector>
      </aapt:attr>
 
      <target android:name="rotationGroup"> *
          <aapt:attr name="android:animation">
              <objectAnimator
              android:duration="6000"
              android:propertyName="rotation"
              android:valueFrom="0"
              android:valueTo="360" />
          </aapt:attr>
      </target>
 
      <target android:name="v" >
          <aapt:attr name="android:animation">
              <set>
                  <objectAnimator
                      android:duration="3000"
                      android:propertyName="pathData"
                      android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
                      android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
                      android:valueType="pathType"/>
              </set>
          </aapt:attr>
       </target>
  </animated-vector>

Shared Transitions

Transitions

To create transition between views set transition name in xml with android:transitionName

 <androidx.appcompat.widget.AppCompatImageView
            // Rest of the imageView properties
            android:transitionName="ivAvatar"/>

or in Kotlin/Java with

iv.setTransitionName("SOME_TRANSITION_NAME")

these names should match for both Activities. To start transition after a click

 val intent = Intent(this, Activity1_1DetailActivity::class.java)
        intent.putExtra("imageRes", imageRes)

        // create the transition animation - the images in the layouts
        // of both activities are defined with android:transitionName="robot"
        val options = ActivityOptions
            .makeSceneTransitionAnimation(
                this,
                ivAvatar,
                ViewCompat.getTransitionName(ivAvatar)
            )
        // start the new activity
        startActivity(intent, options.toBundle())

For custom transitions create transition folder inside res folder and add

<slide xmlns:android="http://schemas.android.com/apk/res/android"
    android:slideEdge="left"
    android:duration="1500">

    <targets>
        <!-- Specify the status bar ID if it needs to be excluded -->
        <target android:excludeId="@android:id/statusBarBackground"/>
        <!-- Specify the navigation bar ID if it needs to be excluded -->
        <target android:excludeId="@android:id/navigationBarBackground"/>
    </targets>

</slide>

default transition for Android system is

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- This is the systems default transition -->
    <changeBounds />
    <changeTransform />
    <changeClipBounds />
    <changeImageTransform />
</transitionSet>

Use <item name="android:windowContentTransitions">true</item> to enable Activity transitions Use <item name="android:windowSharedElementsUseOverlay">false</item> for shared transition items not to be drawn over NavigationBar, or Toolbar

Transition Callbacks and Lifecycles

  • Note Exit-ReEnter transitions, and ReEnter-Return transitions for Activity are same transition by default.
  • Exit, Enter, ReEnter and Return transitions are NULL for fragments by default
  • setExitSharedElementCallback, and sharedElementExitTransition useful for changing shared transition elements that are mapped with String and View. For instance, after transition from RecyclerView to ViewPager or another RecyclerView, user changes the selected page/element and we remap the shared element for the next imageView in ViewPager's current page.

Transition change states and ordering for transitions Between Activities

ExitSharedElementCallback is triggered in first Activity, in second Activity EnterSharedElementCallback is triggered

        Activity1 ---> Activity2
        Exit    ----> Enter
        SharedElementCallback Order: Activity1 Exit -> Activity2 Enter

        I: 🌽 Activity1_1Basics: setExitSharedElementCallback() names:[transition_image_view], sharedElements: {transition_image_view=androidx.appcompat.widget.AppCompatImageView{b3a80cf V.ED..... ...P.... 21,21-231,231 #7f0800c5 app:id/ivPhoto}}
        I: πŸ”₯ Activity1_1Basics: sharedElementExitTransition onTransitionStart()

        I: πŸ’ Activity1_1Details: setEnterSharedElementCallback() names:[transition_image_view], sharedElements: {transition_image_view=androidx.appcompat.widget.AppCompatImageView{11b033f V.ED..... ......ID 0,0-1080,810 #7f0800c4 app:id/ivPhoto}}
        I: 🚌 Activity1_1Details: sharedElementEnterTransition onTransitionStart()

        Activity1 <-- Activity2
        ReEnter <--- Return
        SharedElementCallback Order: Activity2 Exit -> Activity1 Enter
        I: πŸ’ Activity1_1Details: setEnterSharedElementCallback() names:[transition_image_view], sharedElements: {transition_image_view=androidx.appcompat.widget.AppCompatImageView{11b033f V.ED..... ........ 0,0-1080,810 #7f0800c4 app:id/ivPhoto}}
        I: 🌽 Activity1_1Basics: setExitSharedElementCallback() names:[transition_image_view], sharedElements: {transition_image_view=androidx.appcompat.widget.AppCompatImageView{b3a80cf V.ED..... ......ID 21,21-231,231 #7f0800c5 app:id/ivPhoto}}

        I: πŸš• Activity1_1Details: sharedElementReturnTransition onTransitionStart()
        I: 🍏 Activity1_1Basics: sharedElementReenterTransition onTransitionStart()


        onMapSharedElements() does exact same thing in makeSceneTransitionAnimation
        mapping string to view or with Pair<View, String>

Fragment Shared Element Transitions

  • πŸ”₯πŸ”₯πŸ”₯ Make sure that you are importing androidx.transition, do NOT import android.transition components, mixing different import packages causes Wrong Transition Exception

  • exitTransition, enterTransition, returnTransition and reEnterTransitions are null for fragments by default.

  • πŸ”₯πŸ”₯ Setting allowReturnTransitionOverlap to false lets this fragment's reenterTransition to wait previous fragment's returnTransition to finish

  • add sharedElement to fragments with addSharedElement(ivPhoto, ivPhoto.transitionName) and use setReorderingAllowed(true) to optimize for shared element transition

  • With Navigation Components set shared elements as

val direction: NavDirections =
    Fragment2_3MagazineListDirections.actionFragment23MagazineListToFragment23MagazineDetail(
        magazineModel
    )

val extras = FragmentNavigatorExtras(
    binding.ivMagazineCover to binding.ivMagazineCover.transitionName,
)

findNavController().navigate(direction, extras)
  • πŸ”₯πŸ”₯πŸ”₯ With transitions, it's required for start and end values to be different from each other to call createAnimator method.

  • To make sure that ENTER or RETURN transitions start, either set captureStartValues and captureEndValues manually, or in destination fragment create setEnterSharedElementCallback and override onSharedElementStart and onSharedElementEnd methods and set properties of objects that are not shared transitions.

Note:

πŸ”₯πŸ”₯πŸ”₯ In tutorial 2-4 and tutorial 2-5, having same background color for both fragments causing destination fragment's ENTER TRANSITION(CircularReveal and Slide.BOTTOM), and REENTER(Explode) to NOT work. When using Transitions that extend Visiblity class such as Slide, or Fade be careful about background color. Having same background messes enterTransition for destination and returnTransition for source fragments.

To prevent this use one of the solutions below:

1- Set callback and set start and end properties for starting and ending scenes with

        setEnterSharedElementCallback(object : SharedElementCallback() {

            override fun onSharedElementStart(
                sharedElementNames: MutableList<String>?,
                sharedElements: MutableList<View>?,
                sharedElementSnapshots: MutableList<View>?
            ) {
                super.onSharedElementStart(
                    sharedElementNames,
                    sharedElements,
                    sharedElementSnapshots
                )
                viewImageBackground.visibility = View.INVISIBLE
                recyclerView.visibility = View.INVISIBLE
            }

            override fun onSharedElementEnd(
                sharedElementNames: MutableList<String>?,
                sharedElements: MutableList<View>?,
                sharedElementSnapshots: MutableList<View>?
            ) {
                super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots)
                viewImageBackground.visibility = View.VISIBLE
                recyclerView.visibility = View.VISIBLE
            }

        })
    }

2- Use custom transitions that extend either Transition or Visibility and force value changes.

3- Use a separate view for the background, rather than on the root view because it is a shared element. Otherwise it interferes with the window enter transition i.e. as it is resized for the shared element transition, many views are considered 'off-screen' so visibility transitions are not run.

4- Set transitionGroup=false. on layout with background color. transitionGroup sets whether or not this ViewGroup should be treated as a single entity when doing an Activity transition. Typically, the elements inside a ViewGroup are each transitioned from the scene individually. The default for a ViewGroup is false unless it has a background.

  • ⚠️ With EXIT or RETURN transitions captureEndValues is not called, because of this use a transition that extends Visibility for exitTransition and returnTransition to start, and be aware that Animator from onDisAppear is called while current transition is exit or return.

Summary

  • For enterTransition and reEnterTransition either check for background color change and set transitionGroup to false or use transition that extends Visibility with change from INVISIBLE to VISIBLE.

⚠️ With reEnterTransition even though Explode does not work without solving background issue, most of the classes extend Transition or Visibility work fine

  • For exitTransition and returnTransition make sure that visibility goes from VISIBLE to INVISIBLE

  • If addTarget does not work use excludeTarget(view,false)

🀩 Note: Breaker of chains β€” Transition Groups

By default all views under a parent/ancestor with a background set (even transparent ones) will be automatically deemed a group. If you need to break them up like we here with a RecyclerView as the shared-root-white-backgrounded layout with transparent child Item views. You’ll need to set the layout with the background to transitionGroup=false. But on the other hand, since the Items are β€œbackground-less” themselves, to prevent an out-of-body experience you’ll need to do the opposite and set transitionGroup=true on the Item layouts for all the child views in that Item to move together.

Material Transitions

MaterialContainerTransform

The container transform pattern is designed for transitions between UI elements that include a container. This pattern creates a visible connection between two UI elements.

MaterialContainerTransform is a shared element transition. Unlike traditional Android shared elements, it is not designed around a singular piece of shared content, such as an image, to be moved between two scenes. Instead, the shared element here refers to the bounding container of a start View or ViewGroup (e.g. the entire row layout of an item in a list) transforming its size and shape into that of an end View or ViewGroup (e.g. the root ViewGroup of a full screen Fragment). These start and end container Views are the β€œshared element” of a container transform. While these containers are being transformed, their contents are swapped to create the transition.

Examples of the container transform:

  • A card into a details page
  • A list item into a details page
  • A FAB into a details page
  • A search bar into expanded search

MaterialSharedAxis

The shared axis pattern is used for transitions between UI elements that have a spatial or navigational relationship. This pattern uses a shared transformation on the x, y, or z axis to reinforce the relationship between elements.

MaterialElevationScale

  • MaterialFadeThrough

  • MaterialArcMotion

Resources and References

CodeLab Property Animation
Android Design Patterns
android/animation-samples: Multiple samples showing the best practices in animation on Android
Playing with Material Design Transitions ✨ | by Philippe BOISNEY | ProAndroidDev
Meaningful Motion: Circular Reveal & Shared Elements | by Jossi Wolf | Snapp Mobile | Medium
Custom Transitions in Android. Since Android API 19 Google provides a… | by Roman Bielokon | Medium
Propagating Transitions in Android | by Nick Cruz | ProAndroidDev
Shared Element Transition using fragments Android | Developers Breach
Fragment Transitions
Circular reveal animation between Fragments | by Gabor Novak | Medium
Reveal Transition
Motion-Material Design
Material Components Android Examples
Android β€” Inbox Material Transitions for RecyclerView
Plaid App

TODOs:

  • Add RecyclerView, ViewPager animations
  • Add custom Views with animations

More Repositories

1

Jetpack-Compose-Tutorials

πŸš€πŸ§¨πŸ“ Series of Tutorials to learn about Jetpack Compose with subjects Material Widgets, Layout, SubcomposeLayout, custom layouts, State, custom rememberable, recomposition, LaunchedEffect, side-effects, Gesture, Animation, Navigation, Canvas, UIs like whatsapp and others.
Kotlin
2,797
star
2

NavigationComponents-Tutorials

Tutorials about Navigation Components to learn using nav graphs, adding top menus, passing arguments via safe args, combining with different Material Design widgets such as BottomNavigationView, Toolbar, ViewPager2, TabLayout and dynamic feature module navigation with DynamicNavHostFragment and examining Memory Leaks.
Kotlin
393
star
3

Compose-Cropper

πŸš€πŸžβœ‚οΈ Image cropper that can crop with static, dynamic crop behavior, can use customizable shapes, vectors, and other png files as mask to crop with various customizations
Kotlin
362
star
4

Compose-Image

πŸš€πŸžπŸ’ͺ Collection of Images, Modifiers, utility functions for Jetpack Compose to expand and enrich displaying, manipulating, scaling, resizing, zooming, and getting cropped ImageBitmap based on selection area
Kotlin
322
star
5

PropertyFindAR

🏘 πŸŽƒ Real Estate Sample App with RxJava3+Coroutines Flow, Dynamic Feature Modules, Dagger Hilt, Offline First, ConcatAdapter, Animations and tests for Room, Retrofit, useCase and ViewModels with TDD.
Kotlin
263
star
6

Compose-Colorful-Sliders

πŸš€πŸŒˆ 😍 Colorful Sliders written with Jetpack Compose that enliven default sliders with track and thumb dimensions, and gradient colors, borders, labels on top or at the bottom move with thumb and ColorfulIconSlider that can display emoji or any Composable as thumb
Kotlin
194
star
7

Compose-BeforeAfter

πŸš€πŸŒ†πŸ™ Display differences or animate progress between 2 images or Composables with overlay and customization options, zoom, pan gestures, and progress to observe properties for animating before-after progress
Kotlin
159
star
8

Toolbar-Samples

Toolbar Samples with TabLayout, CollapsingToolbarLayout and scroll flags, BottomNavigationView, BottomAppBarLayout and Window insets
Kotlin
153
star
9

Compose-Screenshot

πŸš€πŸ“Έ Screenshot Composables and convert to Bitmap or ImageBitmap on user action or periodically.
Kotlin
136
star
10

Compose-Drawing-App

βœοΈπŸš€ Drawing app written with Jetpack Compose Canvas. Draw using touch down, move and up events.Using array of paths to have erase, undo, or redo actions and set properties for path that will be drawn next separately.
Kotlin
97
star
11

Compose-Extended-Gestures

Counterpart of onTouchEvent, TouchDelegate, Transform gestures that notifies start, end, main pointer, pointers and option to consume PointerInputChange which defines whether other gestures should receive or not.
Kotlin
93
star
12

CoroutinesAndFlowTutorials

Series of Tutorials about Coroutines and Flow with Retrofit, Room, and Unit tests.
Kotlin
90
star
13

Compose-AnimatedList

πŸš€πŸ“±πŸ’–Animated LazyColumn/Row changes scale/color with animation and have a current selected item like a Pager. An elegant alternative for selecting from a list
Kotlin
85
star
14

Compose-Bubble

πŸš€πŸ’¬πŸ«§ Speech/Chat bubble written with Jetpack Compose and canvas with various properties such as arrow width, height, background color, shadow to create similar bubbles whatsapp, telegram or others have.
Kotlin
81
star
15

Posts-MVVM-DaggerHilt-Dynamic-Feature-RxJava3-Flow-Sample

Posts Api sample with Kotlin RxJava3/Coroutines Flow, Clean Architecture, Offline first/last with Room + Retrofit2, Dagger Hilt, Dynamic Feature Modules, Static Code Analysis, Gradle DSL, MockK+ MockWebServer with Test Driven Development including Api and Database tests
Kotlin
70
star
16

Compose-Color-Picker-Bundle

πŸš€πŸŒˆ 🎨 Collection of Color Pickers written with Jetpack Compose with solid Color or Gradient with type, tile mode, and color stops in HSL/HSV/RGB models with Colorful Sliders, displays, and many customization options.
Kotlin
69
star
17

Flexible-Chat-Box

Flexible chat row written with Jetpack Compose that positions message and message status based on number of message lines, message width and parent width. And resizable Subcomposelayout that remasures sibling composables to match their widths' to longest composable that matches quote and message width to max width.
Kotlin
55
star
18

Compose-ProgressIndicator

πŸš€πŸš₯β˜„οΈ Customizable progress indicators like on ios/mac/web, circle, scaled circle, gooey(sticky) indicators and dot indicators written with Jetpack Compose
Kotlin
52
star
19

Compose-Zoom

πŸš€πŸžπŸ” Zoom Modifiers, zoomable image and layouts with limit pan bounds, fling and moving back to valid bounds and callbacks that return current transformation or visible image section
Kotlin
51
star
20

Compose-RatingBar

πŸš€β­οΈπŸ‘ Rating bar to set fixed value or change rating using gestures with png or vector drawables and shimmer effect option
Kotlin
48
star
21

Compose-Extended-Colors

πŸš€πŸŒˆβ™Ύ Utility library that expands Compose Colors with Material Design2 colors, color swatches, Material Design 3 Tonal Palettes, color names, and utility functions to convert between HSL, HSV, RGB, HCT models and to HEX or from HEX
Kotlin
41
star
22

Compose-Color-Detector

πŸš€πŸŒˆπŸ” Detect colors from image or your screen after taking it's screenshot and get details as name, hex code, RGB, HSL. Written with Jetpack Compose and Material Design 3
Kotlin
28
star
23

Unit-Test-Tutorials

Series of Tutorials for Unit Testing in Java and Kotlin using JUnit4, JUnit5, Mockito, MockK and Test Driven Development
Kotlin
24
star
24

Android-DaggerHilt-DynamicFetureModule-Boilerplate

Boilerplate to create empty project with Dagger Hilt, Dynamic Feature modules, MVVM, RxJava, Coroutines with modularization
Kotlin
18
star
25

Dagger2-Tutorials

Series of tutorials for learning Dagger2, including dagger hilt, dynamic feature, dagger-android, dependent components, subcomponents and more
Kotlin
18
star
26

Compose-PagerIndicator

πŸš€πŸ“’πŸ“ Indicators for Horizontal or Vertical Pager with different orientation, color, size options and optional touch feature.
Kotlin
15
star
27

Kotlin-Tutorials

Series of Kotlin Tutorials
Kotlin
13
star
28

BubbleLayout

πŸ’¬ Chat/Speech bubble layout with various properties such as arrow width, height, background color, shadow to create similar bubbles whatsapp, telegram or others have.
Kotlin
11
star
29

MVVM-Tutorials

Series of tutorials about MVVM, data binding and Room and LiveData.
Java
10
star
30

Compose-Badge

βœοΈπŸ“Œ Dynamic Badge with customizable features as max number before displaying with +, color, shadow, border, corner radius, font properties and more written with Jetpack Compose. Displays numbers either in circle or rounded rectangle shape based on badge count and selected threshold to transform from circle to rounded rectangle.
Kotlin
10
star
31

SmartToolFactory

10
star
32

SAF-and-Scoped-Storage-Tutorials

Tutorials, utilities and playground for storing files with File, DocumentFile and Storage Access Framework
Java
9
star
33

BadgeTextView

βœ…βœοΈπŸ“Œ Badge TextView for Android to draw numbers on a TextView which is customizable and scalable. Displays numbers either as circle or rounded rectangle depending on badge count and selected threshold to transform from circle to rounded rectangle.
Kotlin
9
star
34

Compass-with-pixel-perfect

Elegant Compass View uses percentages instead of fixed values to draw components to have similar scales in both portrait and landscape orientations.
Kotlin
8
star
35

DataStructuresAndAlgorithmsPlayground

Playground fo data structures and algorithms
Kotlin
6
star
36

Transactional-Key-Value-Store

Transactional Key Value Store written with Jetpack Compose
Kotlin
5
star
37

My-Market-App

Android Challange 2019 - Market App with Kotlin, Room, Retrofit, Dagger, DataBinding, MVVM Clean Architecture with offline first
Kotlin
5
star
38

Static-Code-Analysis

Playground to test KtLint, Detekt, Git Hooks, Kotlin DSL
Kotlin
4
star
39

Github-Example

Github Example with MVVM, Dagger, RxJava, Retrofit, Navigation Components written with TDD
Kotlin
4
star
40

PhoneNumberCheck

PhoneUtilTest
Kotlin
3
star
41

The-Movie-DB-Example

Movie App Sample with MVVM clean arcitecture, Dagger2, Retrofit, RxJava2, DataBinding and Pagination
Kotlin
3
star
42

Room-Persistence-Library-Tutorials

Series of Tutorials about Room Persistance Library Tutorials
Java
2
star
43

RxJava-Tutorials

Tutorials about RxJava2
Kotlin
2
star
44

HopinStream

Hopin virtual event sample
Kotlin
2
star
45

Dynamic-Features-Tutorial

Series of tutorials about dynamic features and split install
Kotlin
2
star
46

Paging-Library-Tutorials

Paging Library Tutorials with only DB, only network and DB + Network
Kotlin
1
star
47

Bluetooth-LE-Smart-Tutorials

Tutorials about Bluetooth LE
Java
1
star
48

RxAndroid-Kotlin-Tutorials

RxJava Tutorials in Android Environment
Kotlin
1
star
49

RxJava-Style-LiveData-And-Flow-TestObserver

TestObserver class for LiveData to test multiple values like ViewState such as loading, and result states or multiple post and setValues
Kotlin
1
star
50

Answers-for-3-algorithm-questions

Kotlin
1
star
51

Flavors-and-Server-Driven-UI

Sample to create UI elements and enable/disable features based on flavors and Server driven updates. Create new UI or change position of elements based on parsing JSON filed downloaded by remote service such as Firebase or dedicated domain.
Kotlin
1
star