---
title: "MonotonicFrameClock"
description: "Provides a time source for display frames and the ability to perform an action on the next frame.
This may be used for matching timing with the refresh rate of a display or otherwise
synchronizing work with a desired frame rate."
type: "interface"
---

<div class='type'>Interface</div>


<a id='references'></a>

<div class='sourceset sourceset-common'>Common</div>



```kotlin
@JvmDefaultWithCompatibility
public interface MonotonicFrameClock : CoroutineContext.Element
```


Provides a time source for display frames and the ability to perform an action on the next frame.
This may be used for matching timing with the refresh rate of a display or otherwise
synchronizing work with a desired frame rate.


## Properties

<div class='sourceset sourceset-common'>Common</div>


```kotlin
override val key: CoroutineContext.Key<*>
```


## Functions

```kotlin
public suspend fun <R> withFrameNanos(onFrame: (frameTimeNanos: Long) -> R): R
```


Suspends until a new frame is requested, immediately invokes `onFrame` with the frame time in
nanoseconds in the calling context of frame dispatch, then resumes with the result from
`onFrame`.

`frameTimeNanos` should be used when calculating animation time deltas from frame to frame as
it may be normalized to the target time for the frame, not necessarily a direct, "now" value.

The time base of the value provided by `withFrameNanos` is implementation defined. Time
values provided are strictly monotonically increasing; after a call to `withFrameNanos`
completes it must not provide the same value again for a subsequent call.



