---
url: /components/loading-indicator/guidelines.md
description: Loading indicators show the progress of a process for a short wait time
---

# Loading indicator

Loading indicators show the progress of a process for a short wait time

[Overview](overview.md) · [Specs](specs.md) · **Guidelines** · [Accessibility](accessibility.md)

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm41ke7ak-Loading_Indicator-A2.mp4?alt=media" aria-label="Loading indicator on media player."></video>

Loading indicators are best for indicating a short, indeterminate wait time

## Usage

Loading indicators use animation to grab attention, mitigate perceived latency, and indicate that an activity is in progress.<br><br>They should be used when progress isn’t detectable, or when it’s not necessary to indicate how long an activity will take.<br><br>While similar in function to circular progress indicators, loading indicators are a better alternative for short processes between 200ms and 5s.

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fd0ml7-Loading_Indicator-B.mp4?alt=media" aria-label="Loading indicator in loading state with “Getting your device ready...”."></video>

Use a loading indicator when a background process is running

Choose a loading or [progress indicator](../progress-indicators/overview.md "Progress indicators show the status of a process in real time.") that corresponds to the expected wait time and type of process. <br><br>If the wait is very long, consider allowing users to navigate away from the page while the process finishes up.

| Expected wait time           |   Recommendation   |
| ---------------------------- | :----------------: |
| Instant (under 200ms)        |    No indicator    |
| Short (between 200ms and 5s) |  Loading indicator |
| Long (Over 5s)               | Progress indicator |

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fd16y4-Loading_Indicator-C.mp4?alt=media" aria-label="Content appearing on a screen quickly without a loading indicator."></video>

**Instant (under 200ms):** Display the content immediately

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fd1o64-Loading_Indicator-D.mp4?alt=media" aria-label="Content appearing on a screen with a slight lag and a loading indicator."></video>

**Short (between 200ms and 5s):** Use a loading indicator

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fd27h6-Loading-Indicator-E.mp4?alt=media" aria-label="Content appearing on a screen with a long lag and a progress indicator."></video>

**Long (over 5s):** Use a progress indicator

When a process can transition from indeterminate (unknown progress) to determinate (known remaining progress), transition between the corresponding progress indicators. <br><br>Don’t transition a loading indicator into a progress indicator.

::: tip Do
<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm5l84tah-Loading-Indicator-F3.mp4?alt=media" aria-label="A screen transitioning from an indeterminate progress indicator to a determinate progress indicator."></video>

Transition from an indeterminate progress indicator to a determinate progress indicator
:::

::: danger Don't
<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm5l855gf-Loading-Indicator-G2.mp4?alt=media" aria-label="A screen transitioning from a loading indicator to a determinate progress indicator."></video>

Avoid transitioning from a loading indicator to a determinate progress indicator
:::

## Anatomy

![2 parts of an active indicator.](/assets/91dc4d8c-m0cads86-7.DEz_aAvH.webp)

1. Active indicator
2. Container (optional)

### Active indicator

The active indicator is a looping shape morph sequence composed of seven unique Material 3 shapes.<br><br>[More about the Material shape library](../../styles/shape/overview-principles.md#579dd4ba-39f3-4e60-bd9b-1d97ed6ef1bf)

![Active indicator with shape morph.](/assets/d5be62d5-m0cafeiy-8.ORrDmgiq.webp)

The active indicator morphs shape to capture attention

### Container (optional)

When the container is visible, the active indicator should change color from **primary** to **on-primary-container**.<br><br>The container should be visible when the loading indicator is placed over other content. This helps it stand out better by giving it a stronger contrast. It’s not needed when the loading indicator is placed directly on a surface.<br><br>The container should be used with pull-to-refresh behavior.

![Active indicator with container.](/assets/91280845-m0caha9b-9.DtrbTf25.webp)

The container is a circle that provides extra contrast from body content

## Placement

While loading a page or container, the loading indicator should be centered on the element.

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm41keuij-Loading-Indicator-H2.mp4?alt=media" aria-label="Active indicator with shape morph centered on a screen."></video>

Center the loading indicator in the middle of the page or container

When loading more items on a page with existing content, place the loading indicator in the empty space where the new content will appear. Avoid overlapping existing content.

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fd4yi5-Loading-Indicator-I.mp4?alt=media" aria-label="Loading indicator with shape morph underneath photos in a photo app."></video>

Center the loading indicator in the empty space where content will appear

Loading indicators can be placed within other components, such as [buttons](../buttons/overview.md "Buttons let people take action and make choices with one tap."), to indicate that the action is ongoing, such as validating a form or checking for updates.

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fd5yv7-Loading-Indicator-J.mp4?alt=media" aria-label="Loading indicator in a button."></video>

Loading indicators can be placed in buttons that take a few seconds to take effect

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fd65dd-Loading-Indicator-K.mp4?alt=media" aria-label="Loading indicator as the icon in a tab."></video>

Use loading indicators to show progress without taking up much space

## Responsive layout

Loading indicators default to 48dp, but the size is flexible. It should be between 24dp to 240dp, depending on the placement and the breakpoint. Avoid exceeding the minimum and maximum sizes.<br><br>The ratio between the container and the active indicator stays the same when resizing the loading indicator. <br><br>Reserve very large progress indicators for large and extra-large windows, like desktop.

![Loading indicators can range from 24dps to 240dps.](/assets/7ab0d3ab-m0caprda-12.CpXb2b5A.webp)

Loading indicators can range in size from 24–240dp

### Larger windows

As the pane or window size grows, consider scaling the loading indicator as well, so it remains proportional in size to the empty space around it. The loading indicator shouldn’t exceed 240dp.

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fmbf4z7li-GM3_Expressive_Loading-Indicator_Guidelines_16_IA_v01.mp4?alt=media" aria-label="Loading indicator on mobile and tablet screens."></video>

The loading indicator’s default size is ideal for mobile and other compact windows. The loading indicator should scale up in larger windows.

## Behavior

### Pull-to-refresh

The loading indicator is used in [pull-to-refresh](https://developer.android.com/develop/ui/compose/components/pull-to-refresh) on Jetpack Compose only.<br><br>Pull-to-refresh is an Android system feature that manually refreshes screen content with an action or gesture. It’s used at the beginning of lists, grid lists, and card collections where the most recent content appears.<br><br>It’s best to use pull-to-refresh with dynamic content that can have frequent updates, where people have a high chance of seeing new content after refreshing.

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fdewmr-Loading-Indicator-M.mp4?alt=media" aria-label="A loading indicator can appear above content in pull-to-refresh."></video>

The loading indicator for pull-to-refresh can appear on top of the content or adjacent to it

### Threshold requirements

To ensure intentional usage of the pull-to-refresh gesture, the loading indicator must pass a threshold before the app will refresh.

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fdfatx-Loading-Indicator-N.mp4?alt=media" aria-label="Loading indicator with screen refresh after threshold time has passed."></video>

After passing the threshold, completing the gesture initiates a refresh

<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fdfhyq-Loading-Indicator-O.mp4?alt=media" aria-label="Loading indicator reversed can cancel refresh action."></video>

Reversing the gesture past the threshold will cancel the refresh action

The loading indicator remains visible until the refresh activity completes and any new content is visible, or someone navigates away from the refreshing content.

::: tip Do
<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fdfwxf-Loading-Indicator-P.mp4?alt=media" aria-label="A loading indicator at the top of a screen, which appears until content loads."></video>

Keep the loading indicator in view until the activity is completed to provide status of the refresh activity
:::

::: danger Don't
<video controls src="https://firebasestorage.googleapis.com/v0/b/design-spec/o/projects%2Fgoogle-material-3%2Fimages%2Fm0fdg3wa-Loading-Indicator-Q.mp4?alt=media" aria-label="A loading indicator that scrolls off screen."></video>

Don’t scroll the loading indicator off-screen, as it hides the status of the refresh activity. It could imply that the refresh activity is associated with a specific component, such as a card, instead of the entire screen.
:::
