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

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

Вкратце: При обработке 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 ответов

26 просмотров

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

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'ом будешь

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

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

Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
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
Карта сайта