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

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

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

18 просмотров

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

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

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

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

Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
А не хотим ли мы развлечься? 😉 Но так чтобы с пользой для наших профессиональных навыков?? 👨‍🎓👩‍🎓 Предлагаю на октябрь запланировать тестовый запуск новой командной игры "Игр...
Andrii Kurdiumov
2
Это переведённый текст с английского. Я не говорю на русском, но могу использовать переводчик Телеграм. Приветствую! Я начинающий веб-разработчик и все еще учусь. В настояще...
𐩱𐩪𐩣𐩱𐩲𐩺𐩡
2
Всем привет. Хотел бы написать для себя свою ос. Причины: 1) нужен опыт в чем-то 2) будет меньше весить 3) свое, но там будут свои задумки Я понимаю что нужно писать для всег...
Shadow Akira
18
А какие существуют способы обработки ошибок выделения памяти в ядре? Т.е., допустим, есть функция, которая возвращает адрес свободной страницы в физической памяти и диапазон в...
disba1ancer
51
Всем привет! Скажите, никто не пытался уменьшить размер процесса ssl, которые ассоциируется с открытым соединением (не помню точное название этого процесса, но там была какая-...
Алексей
20
5? да там все 10
Boris Vinogradov
12
у кого сколько оперативы на базе данных ?
АДИЛЬБЕК
4
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
5
Карта сайта