Как применить PathEffect без использования Stroke с помощью Jetpack Compose?
Я создаю липкий эффект, как на картинке ниже, комбинируяPathEffect
s, но, насколько я знаю, PathEffect можно применять только к стилю Stroke. Есть ли способ Compose применить PathEffect при заполнении кругов?
val discretePathEffect = DiscretePathEffect(pathMeasure.length / segmentCount, 0f)
val cornerPathEffect = PathEffect.cornerPathEffect(50f)
val chainPathEffect = PathEffect.chainPathEffect(
outer = cornerPathEffect,
inner = discretePathEffect.toComposePathEffect()
)
pathLeft.op(pathLeft, pathRight, PathOperation.Union)
pathMeasure.setPath(pathLeft, true)
drawPath(
path = pathLeft,
brush = brush,
style = Stroke(
4.dp.toPx(),
pathEffect = chainPathEffect
)
)
Мне нужны заполненные круги вместо обводки
1 ответ
Я решил это, используя Compose paint
val paint = remember {
Paint()
}
и рисование с
with(drawContext.canvas) {
this.drawPath(
newPath,
paint
)
}
полная реализация
@Composable
private fun GooeyEffectSample2() {
val pathDynamic = remember { Path() }
val pathStatic = remember { Path() }
/**
* Current position of the pointer that is pressed or being moved
*/
var currentPosition by remember { mutableStateOf(Offset.Unspecified) }
val segmentCount = 20
val pathMeasure = remember {
PathMeasure()
}
val modifier = Modifier
.pointerInput(Unit) {
detectDragGestures { change, _ ->
currentPosition = change.position
}
}
.fillMaxSize()
val paint = remember {
Paint()
}
var isPaintSetUp by remember {
mutableStateOf(false)
}
Canvas(modifier = modifier) {
val center = size.center
val position = if (currentPosition == Offset.Unspecified) {
center
} else currentPosition
pathDynamic.reset()
pathDynamic.addOval(
Rect(
center = position,
radius = 150f
)
)
pathStatic.reset()
pathStatic.addOval(
Rect(
center = Offset(center.x, center.y),
radius = 100f
)
)
pathMeasure.setPath(pathDynamic, true)
val discretePathEffect = DiscretePathEffect(pathMeasure.length / segmentCount, 0f)
val cornerPathEffect = CornerPathEffect(50f)
val chainPathEffect = PathEffect.chainPathEffect(
outer = cornerPathEffect.toComposePathEffect(),
inner = discretePathEffect.toComposePathEffect()
)
if (!isPaintSetUp) {
paint.shader = LinearGradientShader(
from = Offset.Zero,
to = Offset(size.width, size.height),
colors = listOf(
Color(0xffFFEB3B),
Color(0xffE91E63)
),
tileMode = TileMode.Clamp
)
isPaintSetUp = true
paint.pathEffect = chainPathEffect
}
val newPath = Path.combine(PathOperation.Union, pathDynamic, pathStatic)
with(drawContext.canvas) {
this.drawPath(
newPath,
paint
)
}
}
}