просто будет интересно разобраться, в чём загвоздка):
Вкратце: При обработке 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? Как сделать так, чтобы выдавалась корректная координата Х?
Заранее благодарен всем неравнодушным🙏
Мэн, ты точно хочешь разобраться в этом вопросе? Чувство, что ты хочешь запутаться
Да просто баг словил из-за этого прикола) Хз, как пофиксить)
Там куча методов, посмотри их все и, возможно, найдешь нужный
Вряд ли кому-то будет интересно, но задачу решил. Для тех, кому всё таки интересно узнать: change:PointerInputChange в detectDragGesturesAfterLongPress передаёт локальную координату элемента относительно родителя (как я понял). Соответственно он выдаёт значения позиции курсора "локальные", не корректные относительно всего экрана. Чтобы взять глобальные координаты, я заюзал Modifier.onGloballyPositioned. Из этого метода получил координаты элемента и приплюсовал к локальным координатам из detectDragGesturesAfterLongPress. В итоге, получились глобальные координаты.
Подожди, ты как из родителя выйдешь - получишь type released, зачем тебе глобальные координаты?
Чтобы сверять их с глобальными координатами других элементов на экране. У элементов разные родители
Так touch event (input scope) не может выйти за пределы родителя - событие просто не дойдет. Может проще было все же не глобальные координаты сверять? Сами же layouts родителей не двигаются относительно друг друга?
Родители не двигаются, да. Не совсем понимаю, что ты имеешь ввиду в первом предложении. Могу сказать, что передаю сохранённые через стэйт внутри remember координаты наверх по иерархии, чтобы рекомпозировать вьюхи, которые нужно
Не, я ошибся, сейчас проверил, release приходит только когда палец ушел вверх, до тех пор события приходят.
представьте себе, если человек не разбирающийся в программировании прочитает этот тред
В голосину
Ещё и touch-или друг друга😁
А если с дядей и маминой подругой, считается?
И они такие: ну чо стоишь, присоединяйся, slave'ом будешь
Обсуждают сегодня