Всем привет. У меня такой кейс: есть Box с картинкой

и текстом. Мне нужно, чтобы при нажатии и удерживании этого Box он менял форму - изменял background и немного уменьшался в размере. Я нашел один способ: через
.pointerInput(Unit){
detectTapGestures(
onPress = {
Timber.d("this is pressed")
// some code
tryAwaitRelease()
// some code
Timber.d("yeeah this is released")
}
)
}
Если я удерживаю, и отпускаю - то все отрабатывает нормально. Но если я удерживаю и начанию перемещать палец по этому Box - то он думает, что я отпустил палец и выполняет часть кода после tryAwaitRelease()
Есть какие нибудь другие способы реализации моего кейса или кто нибудь знает как пофиксить мое текущее решение ?

7 ответов

19 просмотров

если глянешь внутрь 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() } Не тестил, но что-то типа вот этого должно быть

Dmitry Fabrichny
если глянешь внутрь detectTapGestures() то там выз...

а, возможно ещё надо добавить проверку что палец находится внутри кнопки пока ты его двигаешь, а не за пределами, т.е. изменить условие на if (currentChange.changedToUp() || currentChange.isOutOfBounds(size, extendedTouchPadding)) { break }

Andrew-F Автор вопроса
Dmitry Fabrichny
если глянешь внутрь detectTapGestures() то там выз...

спасибо! Завтра попробую это сделать

Andrew-F Автор вопроса
Dmitry Fabrichny
если глянешь внутрь detectTapGestures() то там выз...

Еще раз спасибо за идею, очень помогло. Но я сделал немного по другому: в методе 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 // } } } Не подскажете, это нормальное решение или есть какие то скрытые проблемы?

Andrew F
Еще раз спасибо за идею, очень помогло. Но я сдела...

>Но я сделал немного по другому вот за это я и люблю композ, так как в композе всё или функция или экстеншен функция и если что-то не нравится в какой-то дефолтной реализации или что-то добавить надо, то можно спокойно выдрать дефолтную реализацию, изменить и дальше использовать её

Andrew-F Автор вопроса
Dmitry Fabrichny
>Но я сделал немного по другому вот за это я и люб...

соглашусь, в некоторых кейсах это огромный плюс

Похожие вопросы

Обсуждают сегодня

Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
А в каком формате фреймы? Сам формат сейчас придумываешь, или что-то готовое нужно распарсить?
Okhsunrog
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Карта сайта