Android Compose нарисуйте путь для стирания переднего планаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Android Compose нарисуйте путь для стирания переднего плана

Сообщение Anonymous »

Я учусь, немного возясь с холстом в Composable.
Идея, которую я ищу, заключается в следующем:
  • Имейте цвет фона (в данном случае просто делайте градиент цветов)
  • Черный передний план, закрывающий фон
  • Нарисуйте путь на экране, который в некотором смысле сотрет черный передний план там, где он нарисован, чтобы обнажить фон.
Я успешно это сделал но я немного не понимаю, как это должно работать, поскольку я наткнулся на решение. Возможно, это все-таки неправильно, и я поступаю неправильным путем.
Ниже мой код:

Код: Выделить всё

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//enableEdgeToEdge()
setContent {
SampleScratchPadTheme {

var reset by remember {
mutableStateOf(false)
}

Scaffold(modifier = Modifier.fillMaxSize(), floatingActionButton = {
FloatingActionButton(onClick = {
reset = true
}, shape = RoundedCornerShape(25.dp)) {
Icon(
imageVector = Icons.Default.Refresh,
contentDescription = "Restart"
)
}
}) { innerPadding ->

Column(
modifier = Modifier
.fillMaxSize()
.padding(innerPadding)
) {
Column {
Sample(reset, resetCanvas = {
reset = false
})
}

}
}
}
}
}

@Composable
private fun Sample(
reset : Boolean,
resetCanvas : () -> Unit
) {

var circles = remember {
mutableStateListOf(Offset(-100f, -100f)) // start off screen
}

var erasedPoints by remember {
mutableStateOf(Path())
}

fun changeColor(): List  {
return listOf(
Color(
Random.nextInt(255),
Random.nextInt(255),
Random.nextInt(255),
255
),
Color(
Random.nextInt(255),
Random.nextInt(255),
Random.nextInt(255),
255
),
Color(
Random.nextInt(255),
Random.nextInt(255),
Random.nextInt(255),
255
)
)
}

var gradientColors by remember {
mutableStateOf(changeColor())
}

var pointerOffset by remember {
mutableStateOf(Offset(0f, 0f))
}

if(reset){
circles.clear()
erasedPoints.reset()
gradientColors = changeColor()
resetCanvas()
}

Box(modifier = Modifier
.fillMaxSize()
.clipToBounds()
.pointerInput("dragging") {
detectDragGestures(onDragStart = {
pointerOffset = it
erasedPoints.moveTo(pointerOffset.x, pointerOffset.y)
circles.add(pointerOffset)
}) { change, dragAmount ->
pointerOffset += dragAmount
erasedPoints.lineTo(pointerOffset.x, pointerOffset.y)
circles.add(pointerOffset)

}
}
.drawBehind {
drawRect(
brush = Brush.linearGradient(
colors = gradientColors,
start = Offset.Zero,
end = Offset.Infinite
)
)
}
.drawWithContent {
drawRect(Color.Black)
circles.forEach {
drawCircle(
brush = Brush.linearGradient(
colors = gradientColors,
start = Offset.Zero,
end = Offset.Infinite
), center = it,
radius = 25f,
blendMode = BlendMode.SrcIn
)
}
if (!erasedPoints.isEmpty) {
drawPath(
path = erasedPoints,
brush = Brush.linearGradient(
colors = gradientColors,
start = Offset.Zero,
end = Offset.Infinite
),
style = Stroke(
width = 50f,
cap = StrokeCap.Round,
join = StrokeJoin.Round
),
blendMode = BlendMode.SrcIn
)
}
}) {

}
}
Меня смущает следующее:

Код: Выделить всё

drawRect(Color.Black)
circles.forEach {
drawCircle(
brush = Brush.linearGradient(
colors = gradientColors,
start = Offset.Zero,
end = Offset.Infinite
), center = it,
radius = 25f,
blendMode = BlendMode.SrcIn
)
}
if (!erasedPoints.isEmpty) {
drawPath(
path = erasedPoints,
brush = Brush.linearGradient(
colors = gradientColors,
start = Offset.Zero,
end = Offset.Infinite
),
style = Stroke(
width = 50f,
cap = StrokeCap.Round,
join = StrokeJoin.Round
),
blendMode = BlendMode.SrcIn
)
}
Изображение

Изображение показывает желаемые результаты, но работает только тогда, когда я добавляю drawPath и прохожу через методы drawCircle.
Если я оставлю только drawPath и удалю цикл drawCircle, я думаю, это все, что нужно, то ничего не происходит экран. Просто черный.
Если я изменю режим наложения на BlendMode.CLEAR в drawCircle, я получу следующее:
Изображение

Кажется, нет необходимости использовать оба метода. Я думаю, все, что мне нужно, это drawPath.
Буду очень признателен за любую информацию или рекомендации.

Подробнее здесь: https://stackoverflow.com/questions/791 ... foreground
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Android Compose нарисуйте путь для стирания переднего плана
    Anonymous » » в форуме Android
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Android Compose нарисуйте путь для стирания переднего плана
    Anonymous » » в форуме Android
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Исключение Android 14 при запуске службы переднего плана с типами переднего плана
    Anonymous » » в форуме Android
    0 Ответы
    60 Просмотры
    Последнее сообщение Anonymous
  • Служба переднего плана в чистом коде MVVM в Android
    Гость » » в форуме Android
    0 Ответы
    65 Просмотры
    Последнее сообщение Гость
  • Получить название активности приложения переднего плана на Android
    Anonymous » » в форуме Android
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»