Implementing the Shimmer Effect in Jetpack Compose for Android Apps

Dheeraj Singh Bhadoria
3 min readJun 20, 2023

Create Engaging Loading Animations with the Shimmer Effect in Jetpack Compose for Android Apps

Shimmer Effect in Jetpack Compose Android Apps

Introduction:
Jetpack Compose, the modern UI toolkit for Android app development, offers powerful tools and capabilities to create engaging and interactive user interfaces. One such visually appealing feature is the shimmer effect, which provides a subtle animation that indicates content loading or placeholders. In this article, we will explore how to implement the shimmer effect in a Jetpack Compose-based Android app.

Prerequisites:
To follow along with this tutorial, it is assumed that you have basic knowledge of Jetpack Compose and are familiar with Kotlin programming language.

Implementation:
We will start by creating a new composable function called CountryListScreen. This function will be responsible for displaying a button and the country list. Let's dive into the code:

CountryListScreen.kt

In the CountryListScreen function, we define two state variables: showCountryList and showShimmerEffect. The showCountryList variable keeps track of whether the country list should be displayed, and showShimmerEffect determines whether the shimmer effect should be shown or not. We use the Button composable from Jetpack Compose to create a button labeled "Show Country". When the button is clicked, we set showCountryList to true and showShimmerEffect to true.

Next, we implement the shimmer effect in the ShimmerEffect composable:

ShimmerEffect.kt

The ShimmerEffect composable uses the rememberInfiniteTransition to create a continuously repeating animation. We define an animatedValue that transitions from 0 to 1 using animateFloat. This value will control the position of the shimmer effect. Inside the Column, we repeat the ShimmerItem composable five times to create multiple shimmering elements.

Now, let’s dive into the ShimmerItem composable. This composable is responsible for drawing the shimmer effect on a single item. Here's the code:

ShimmerItem.kt

Inside the ShimmerItem composable, we use a Box composable as the parent to contain the shimmer effect. Within the Canvas, we use the drawIntoCanvas extension function to access the underlying android.graphics.Canvas. We create a Paint object and set it up with a linear gradient from transparent to white.

The colors array defines the colors for the gradient, where we start with transparent, transition to white based on the animatedValue, and end with transparent again. The positions array defines the relative position of each color in the gradient.

We then create a LinearGradient using the android.graphics.LinearGradient class, specifying the start and end coordinates, the colors array, and the positions array. Next, we set the shader of the Paint object to the created gradient.

Inside the drawIntoCanvas block, we use the nativeCanvas property to access the underlying android.graphics.Canvas. We use withSave to save the current state of the canvas and perform the drawing operations within a scoped block. Finally, we create a RectF object representing the rectangle's dimensions and draw a rounded rectangle on the canvas using the drawRoundRect method.

Lastly, let’s take a look at the CountryList composable:

CountryList.kt

The CountryList composable is a simple composable function that displays a list of countries. It iterates over the countryList and uses the Text composable to display each country. We set the text color to Color.White to ensure it stands out on the dark background.

Conclusion:
In this article, we explored how to implement the shimmer effect in a Jetpack Compose-based Android app. We walked through the code for creating a CountryListScreen composable that displays a button and a country list. We also examined the ShimmerEffect and ShimmerItem composable functions responsible for rendering the shimmer effect. Finally, we implemented the CountryList composable to display a list of countries with white text color.

Github Repository:-

--

--