Ответ 1
Вопрос: Какой будет самый простой/самый элегантный способ достижения это?
Как вы уже видели, вы не можете использовать класс View.DragShadowBuilder
, так как нет способа отделить точку теневого дескриптора и точку, принятую во внимание для всех отправленных событий перетаскивания. Я также не вижу другого способа переопределения системы перетаскивания, даже расширяя класс View
(что было бы громоздким).
Я думаю, что смогу наложить невидимый слой на экран во время перетаскивания который регистрирует координаты сенсорной точки, переводит их и отправляет их на фактические целевые показатели - реально реализовать drag-события.
Это в один конец, чтобы сделать это, и это довольно просто, если у вас нет сложного требования перетаскивания.
Но я хотел бы знать, есть ли более простое решение.
Возможно, вам лучше расширить базовые макеты Android (по крайней мере, те, которые вы будете использовать) и реализовать там логику перетаскивания. Это позволит вам избежать необходимости управления другим слоем, а также выполнить некоторые дополнительные вычисления. Я расширил класс RelativeLayout
, чтобы реализовать эту логику, которую вы можете найти здесь. Я использовал этот класс в Activity like this, который this макет. Образец является базовым, и ему требуется больше работы (и мышления), чтобы сделать его более гибким, а также решить некоторые потенциальные проблемы.