Всем привет! Может быть кто-то сталкивался с такой задачкой (или может

просто будет интересно разобраться, в чём загвоздка):

Вкратце: При обработке onDrag ивента, когда юзер зажимает пальцем элемент и водит влево/вправо, нужно брать координаты пальца/курсора.
Проблема: Почему-то координата Х имеет значение с каким-то смещением, не показывая реальную координату пальца/курсора.

Детальнее:

В самописной кнопке (копипаст имплементации обычной Button) на Surface используется Modifier.pointerInput(Unit){ ... detectDragGesturesAfterLongPress { ... }}

Внутри detectDragGesturesAfterLongPress доступен параметр change:PointerInputChange. И его данные change.position.x (Float)соответственно. Однако координата Х не соответствует реальному положению курсора.

В доке по detectDragGesturesAfterLongPress сказано для onDragStart: called when a long press is detected and includes an Offset
representing the last known pointer position relative to the containing element.
The Offset can be outside the actual bounds of the element
itself meaning the numbers can be negative or larger than the element bounds if the touch target is smaller than the ViewConfiguration.minimumTouchTargetSize.

Кнопка точно больше minimumTouchTargetSize (=48х48dp).

Вопрос: по какому алгоритму определяется position у change в методе detectDragGesturesAfterLongPress? Как сделать так, чтобы выдавалась корректная координата Х?

Заранее благодарен всем неравнодушным🙏

14 ответов

21 просмотр

Мэн, ты точно хочешь разобраться в этом вопросе? Чувство, что ты хочешь запутаться

Alexander-Konopelko Автор вопроса

Да просто баг словил из-за этого прикола) Хз, как пофиксить)

Alexander Konopelko
Да просто баг словил из-за этого прикола) Хз, как ...

Там куча методов, посмотри их все и, возможно, найдешь нужный

Alexander-Konopelko Автор вопроса

Вряд ли кому-то будет интересно, но задачу решил. Для тех, кому всё таки интересно узнать: change:PointerInputChange в detectDragGesturesAfterLongPress передаёт локальную координату элемента относительно родителя (как я понял). Соответственно он выдаёт значения позиции курсора "локальные", не корректные относительно всего экрана. Чтобы взять глобальные координаты, я заюзал Modifier.onGloballyPositioned. Из этого метода получил координаты элемента и приплюсовал к локальным координатам из detectDragGesturesAfterLongPress. В итоге, получились глобальные координаты.

Alexander Konopelko
Вряд ли кому-то будет интересно, но задачу решил. ...

Подожди, ты как из родителя выйдешь - получишь type released, зачем тебе глобальные координаты?

Alexander-Konopelko Автор вопроса
Maxim Filatov
Подожди, ты как из родителя выйдешь - получишь typ...

Чтобы сверять их с глобальными координатами других элементов на экране. У элементов разные родители

Alexander Konopelko
Чтобы сверять их с глобальными координатами других...

Так touch event (input scope) не может выйти за пределы родителя - событие просто не дойдет. Может проще было все же не глобальные координаты сверять? Сами же layouts родителей не двигаются относительно друг друга?

Alexander-Konopelko Автор вопроса
Maxim Filatov
Так touch event (input scope) не может выйти за пр...

Родители не двигаются, да. Не совсем понимаю, что ты имеешь ввиду в первом предложении. Могу сказать, что передаю сохранённые через стэйт внутри remember координаты наверх по иерархии, чтобы рекомпозировать вьюхи, которые нужно

Alexander Konopelko
Родители не двигаются, да. Не совсем понимаю, что ...

Не, я ошибся, сейчас проверил, release приходит только когда палец ушел вверх, до тех пор события приходят.

Alexander Konopelko
Родители не двигаются, да. Не совсем понимаю, что ...

представьте себе, если человек не разбирающийся в программировании прочитает этот тред

Alexander-Konopelko Автор вопроса

В голосину

Ещё и touch-или друг друга😁

А если с дядей и маминой подругой, считается?

И они такие: ну чо стоишь, присоединяйся, slave'ом будешь

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

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

Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
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
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
14
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
Карта сайта