Это то, что я делаю в приложении, которое я сейчас заканчиваю. Когда пользователь перетаскивает что-то на экран, я показываю видимую сетку привязки, и объект привязывается к этой сетке, когда перетаскивание завершено. Чтобы показать сетку, мой подход заключается в использовании отдельного настраиваемого View
, который я назвал GridOverLayView
. Он накладывается поверх всей области экрана, и он очень просто рисует сетку привязки в своем методе onDraw()
. Он становится видимым только тогда, когда что-то тянется.
Теперь о фактическом Activity
, в котором перетаскивания и сбрасывания обрабатывается, одна частности константа я определил это:
static final int SNAP_GRID_INTERVAL = 20;
Когда объект перетаскивается вокруг, то есть при обработке event.getAction()==MotionEvent.ACTION_MOVE
событий в моей OnTouchListener
, я выполняю привязку расположения объекта к сетке с помощью следующего:
RelativeLayout.LayoutParams par = (RelativeLayout.LayoutParams) mThingBeingDragged.getLayoutParams();
par.topMargin = Math.round((event.getRawY() - draggedInitialY) /SNAP_GRID_INTERVAL) * SNAP_GRID_INTERVAL;
par.leftMargin = Math.round((event.getRawX() - draggedInitialX)/SNAP_GRID_INTERVAL) * SNAP_GRID_INTERVAL;
mThingBeingDragged.setLayoutParams(par);
... где draggedInitialY
и draggedInitialX
магазина начального касания постулировать ион, записанный во время начального MotionEvent.ACTION_DOWN
.
Еще одно приятное прикосновение - позволить перемещать объект, чтобы его можно было перемещать без привязки, но привяжите его к сетке только в .ACTION_UP
, когда пользователь поднимает их палец. На практике это гораздо приятнее в использовании.
Это блестящий. Очень ясный ответ. Если бы я мог, то был бы выше. Спасибо за ваш быстрый ответ. Я попробую сейчас. – maffo