Иногда бывает необходимо отрисовать отдельные точки. Для этого Compose предоставляет функцию drawPoints():
fun drawPoints( points: List<Offset>, pointMode: PointMode, color: Color, strokeWidth: Float = Stroke.HairlineWidth, cap: StrokeCap = StrokeCap.Butt, pathEffect: PathEffect? = null, alpha: @FloatRange(from = 0.0, to = 1.0) Float = 1.0f, colorFilter: ColorFilter? = null, blendMode: BlendMode = DefaultBlendMode ): Unit
Эта функция принимает следующие параметры:
points
: список точек для отрисовки, где каждая точка представляет объект Offset
pointMode
: тип точек. Указывает, будет ли каждая
точка отображаться отдельно (режим PointMode.Points
) или соединяться линиями с использованием режимов PointMode.Lines
и PointMode.Polygon
color
: цвет пути
strokeWidth
: ширина линий между точками
cap
: тип завершения линий между точками
alpha
: прозрачность, применяемая к цвету точек в виде значения из диапазона от 0.0f до 1.0f
style
: стиль заполнения точек
colorFilter
: цветовой фильтр ColorFilter, который применяется к цвету точек
blendMode
: алгоритм смешивания, применяемый к цвету
Например, следующий код отображает синусоидальную волну, состоящую из отдельных точек:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.layout.size import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.PointMode class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Canvas(Modifier.size(300.dp).background(Color.LightGray)) { val height = size.height val width = size.width val points = mutableListOf<Offset>() for (x in 0..size.width.toInt()) { val y = (kotlin.math.sin(x * (2f * 3.1415 / width)) * (height / 2) + (height / 2)).toFloat() points.add(Offset(x.toFloat(), y)) } drawPoints( points = points, strokeWidth = 4f, pointMode = PointMode.Polygon, color = Color.Blue ) } } } }