и текстом. Мне нужно, чтобы при нажатии и удерживании этого Box он менял форму - изменял background и немного уменьшался в размере. Я нашел один способ: через
.pointerInput(Unit){
detectTapGestures(
onPress = {
Timber.d("this is pressed")
// some code
tryAwaitRelease()
// some code
Timber.d("yeeah this is released")
}
)
}
Если я удерживаю, и отпускаю - то все отрабатывает нормально. Но если я удерживаю и начанию перемещать палец по этому Box - то он думает, что я отпустил палец и выполняет часть кода после tryAwaitRelease()
Есть какие нибудь другие способы реализации моего кейса или кто нибудь знает как пофиксить мое текущее решение ?
если глянешь внутрь detectTapGestures() то там вызывается функция waitForUpOrCancellation() и если глянуть её, то там будет видно проверку, которая чекает сдвинулся ли палец, и если сдвинулся, то жест отменяется. В этом и есть проблема. Очевидный фикс - написать свой собственный детектор для этого жеста. Что-то типа val down = awaitFirstDown() try { callback.onPointerDown() while (true) { val currentEvent = awaitPointerEvent() val currentChange = currentEvent.changes.firstOrNull { it.id == down.id } ?: break if (currentChange.changedToUp()) { break } } } finally { callback.onPointerUp() } Не тестил, но что-то типа вот этого должно быть
а, возможно ещё надо добавить проверку что палец находится внутри кнопки пока ты его двигаешь, а не за пределами, т.е. изменить условие на if (currentChange.changedToUp() || currentChange.isOutOfBounds(size, extendedTouchPadding)) { break }
спасибо! Завтра попробую это сделать
Еще раз спасибо за идею, очень помогло. Но я сделал немного по другому: в методе waitForUpCancellation() есть проверка на изменение положения пальца - про которую вы и сказали - вот я ее как раз и закомментировал просто. Получилось так: suspend fun AwaitPointerEventScope.customWaitForUpOrCancellation(): PointerInputChange? { while (true) { val event = awaitPointerEvent(PointerEventPass.Main) if (event.changes.fastAll { it.changedToUp() }) { Timber.d("it is up") // All pointers are up return event.changes[0] } if (event.changes.fastAny { it.consumed.downChange || it.isOutOfBounds(size, extendedTouchPadding) } ) { Timber.d("is out of bounds") return null // Canceled } // Check for cancel by position consumption. We can look on the Final pass of the // existing pointer event because it comes after the Main pass we checked above. // val consumeCheck = awaitPointerEvent(PointerEventPass.Final) // if (consumeCheck.changes.fastAny { it.positionChangeConsumed() }) { // return null // } } } Не подскажете, это нормальное решение или есть какие то скрытые проблемы?
>Но я сделал немного по другому вот за это я и люблю композ, так как в композе всё или функция или экстеншен функция и если что-то не нравится в какой-то дефолтной реализации или что-то добавить надо, то можно спокойно выдрать дефолтную реализацию, изменить и дальше использовать её
соглашусь, в некоторых кейсах это огромный плюс
Обсуждают сегодня