An easing function for an arbitrary Path.

The Path must begin at (0, 0) and end at (1, 1). The x-coordinate along the Path is the input value and the output is the y coordinate of the line at that point. This means that the Path must conform to a function y = f(x).

The Path must be continuous along the x axis. The Path should also be monotonically increasing along the x axis. If the Path is not monotonic and there are multiple y values for a given x, the chosen y value is implementation dependent and may vary.

The Path must not contain any Path.close command as it would force the path to restart from the beginning.

This is equivalent to the Android PathInterpolator.

CubicBezierEasing should be used if a single bezier curve is required as it performs fewer allocations. PathEasing should be used when creating an arbitrary path.

Note: a PathEasing instance can be used from any thread, but not concurrently.

import androidx.compose.animation.core.PathEasing
import androidx.compose.animation.core.animateIntOffsetAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp

// Creates a custom PathEasing curve and applies it to an animation
var toggled by remember { mutableStateOf(true) }
val pathForAnimation = remember {
    Path().apply {
        moveTo(0f, 0f)
        cubicTo(0.05f, 0f, 0.133333f, 0.06f, 0.166666f, 0.4f)
        cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f)
    }
}
val offset by
    animateIntOffsetAsState(
        targetValue = if (toggled) IntOffset.Zero else IntOffset(300, 300),
        label = "offset",
        animationSpec = tween(durationMillis = 1000, easing = PathEasing(pathForAnimation))
    )
Box(modifier = Modifier.fillMaxSize().clickable { toggled = !toggled }) {
    Box(modifier = Modifier.offset { offset }.size(100.dp).background(Color.Blue))
}

Summary

Public constructors

Cmn

Public functions

open Float
transform(fraction: Float)
Cmn

Public constructors

PathEasing

PathEasing(path: Path)
Parameters
path: Path

The Path to use to make the curve representing the easing curve.

Public functions

transform

open fun transform(fraction: Float): Float