Как можно удалить "целевую точку" теневой тени Android из ее "точки касания"?

Я разрабатываю приложение, которое будет полезно для более точного контроля над тем, куда перетаскивается объект перетаскивания. Но с емкостным сенсорным экраном пользовательский палец всегда будет скрывать цель падения.

Android позволяет "сенсорную точку" на теневой трюке задавать, перезаписывая метод View.DragShadowBuilder.onProvideShadowMetrics(). Но, похоже, не существует способа обеспечить перемещенную "целевую точку". Я хотел бы проецировать стрелку с сенсорной точки теневой тень, которая может быть маневрирована на целевой камере с большей точностью.

Вопрос: Какой будет самый простой/самый элегантный способ достичь этого?

Я думаю, что я мог бы поместить невидимый слой поверх экрана во время операции перетаскивания, которая регистрирует координаты точки касания, переводит их и отправляет их в фактические целевые объекты перетаскивания - существенно реинжинируйте события drag-events. Но я хотел бы знать, есть ли более простое решение. Или если кто-то еще сделал что-то подобное раньше.


Изменить: Вот грубый макет теневой тени, который я хотел бы иметь:

enter image description here

Ответы

Ответ 1

Вопрос: Какой будет самый простой/самый элегантный способ достижения это?

Как вы уже видели, вы не можете использовать класс View.DragShadowBuilder, так как нет способа отделить точку теневого дескриптора и точку, принятую во внимание для всех отправленных событий перетаскивания. Я также не вижу другого способа переопределения системы перетаскивания, даже расширяя класс View (что было бы громоздким).

Я думаю, что смогу наложить невидимый слой на экран во время перетаскивания который регистрирует координаты сенсорной точки, переводит их и отправляет их на фактические целевые показатели - реально реализовать drag-события.

Это в один конец, чтобы сделать это, и это довольно просто, если у вас нет сложного требования перетаскивания.

Но я хотел бы знать, есть ли более простое решение.

Возможно, вам лучше расширить базовые макеты Android (по крайней мере, те, которые вы будете использовать) и реализовать там логику перетаскивания. Это позволит вам избежать необходимости управления другим слоем, а также выполнить некоторые дополнительные вычисления. Я расширил класс RelativeLayout, чтобы реализовать эту логику, которую вы можете найти здесь. Я использовал этот класс в Activity like this, который this макет. Образец является базовым, и ему требуется больше работы (и мышления), чтобы сделать его более гибким, а также решить некоторые потенциальные проблемы.