Skip to content

Spotlight

Implements a mechanism analogous to a view pager; has a single active element ("it's in the spotlight", hence the name), but unlike the back stack, it does not remove other elements.

It's great for flows or tabbed containers.

States

enum class State {
    INACTIVE_BEFORE, ACTIVE, INACTIVE_AFTER;
}

Constructing spotlight

Requires defining items and an active index.

class Spotlight<NavTarget : Any>(
    items: List<NavTarget>,
    initialActiveIndex: Int = 0,
    savedStateMap: SavedStateMap?,
    // Optional parameters are omitted
)

Default on screen resolution

As a default, only the active element is considered on screen.

object SpotlightOnScreenResolver : OnScreenStateResolver<Spotlight.State> {
    override fun isOnScreen(state: Spotlight.State): Boolean =
        when (state) {
            Spotlight.State.INACTIVE_BEFORE,
            Spotlight.State.INACTIVE_AFTER -> false
            Spotlight.State.ACTIVE -> true
        }
}

Default transition handlers

SpotlightFader

rememberSpotlightFader()

Adds simple cross-fading transitions

SpotlightSlider

rememberSpotlightSlider()

Adds horizontal sliding transitions so that the ACTIVE element is in the center; other states are animated from / to the left or the right edge of the screen, depending on the order of them in the items property.

Operations

Activate

spotlight.activate(navTarget)

Transitions the element to ACTIVE. Transitions other elements to INACTIVE_BEFORE or INACTIVE_AFTER depending on their relative position to the activated element.

Next

spotlight.next()

Transitions the currently active element to INACTIVE_BEFORE. Transitions the element after the currently active one to ACTIVE.

Previous

spotlight.previous()

Transitions the currently active element to INACTIVE_AFTER. Transitions the element before the currently active one to ACTIVE.

Update elements

spotlight.updateElements(items, activeIndex)

Replaces elements held by the spotlight instance with a new list. Transitions new elements to INACTIVE_BEFORE, ACTIVE, or INACTIVE_AFTER depending on their position in the provided list relative to activeIndex.

Back press strategy

You can override the default strategy in the constructor. You're not limited to using the provided classes, feel free to implement your own.

class Spotlight<NavTarget : Any>(
    /* ... */
    backPressHandler: BackPressHandlerStrategy<NavTarget, State> = GoToDefault(
        initialActiveIndex
    )
    /* ... */
)

GoToDefault

The default back press handling strategy. Activates the default index.

GoToPrevious

Runs a Previous operation.

Operation strategy

You can override the default strategy in the constructor. You're not limited to using the provided classes, feel free to implement your own.

class Spotlight<NavTarget : Any>(
    /* ... */
    operationStrategy: OperationStrategy<NavTarget, State> = ExecuteImmediately(),    
    /* ... */
)

ExecuteImmediately

The default strategy. New operations are executed without any questions, regardless of any already running transitions.