Compose Unstyled 2.0 is out! Check the official announcement blog ->
Class

MeshGradientPainter

A MeshGradient is a 2D grid of patches defined by vertices.

Source set: Common
class MeshGradientPainter
@RememberInComposition
constructor(
@param:IntRange(from = 1) private val rows: Int,
@param:IntRange(from = 1) private val columns: Int,
private val hasBicubicColor: Boolean = false,
private val block: MeshGradientScope.() -> Unit,
) : Painter()

A MeshGradient is a 2D grid of patches defined by vertices. Each vertex has a position, color, and four optional Bezier control points (tangents) that define the curvature of the edges connecting neighboring vertices.

Grid Dimensions: For a given rows and columns (representing the number of patches), there are a total of (rows + 1) * (columns + 1) vertices. For example, a 1x1 mesh consists of 4 vertices forming a single rectangular patch.

Coordinate System: All positions and Bezier offsets use a normalized coordinate system where (0,0) is the top-left and (1,1) is the bottom-right of the drawing bounds.

Bezier Tangents: Bezier control points are provided as an Offset relative to the vertex position. The default value of a Bezier control point is Offset.Unspecified. If a control point is Offset.Unspecified, the renderer automatically infers a tangent based on the neighboring vertices to ensure C1 continuity (smooth transitions) across patches.

Parameters

rows The number of patches along the vertical axis. Must be at least 1.
columns The number of patches along the horizontal axis. Must be at least 1.
hasBicubicColor When true, uses Catmull-Rom interpolation for colors, resulting in smoother transitions compared to simpler and slightly faster bilinear interpolation.
block Lambda invoked to configure the mesh. Use the provided MeshGradientScope to set the properties of each vertex. This block is executed in a DrawScope and hence can observe reads to any mutable state. Any unconfigured vertex will have a default position of Offset.Zero and a default color of Color.Transparent.

Last updated: