Я пытаюсь добавить наложение в MapView из фонового потока, чтобы оптически пометить точку, к которой в данный момент касается пользователь.
В данный момент я пытаюсь добиться этого, используя Timer / Handler.
Когда MotionEvent имеет значение ACTION_DOWN, я публикую задачу, которая добавляет наложение кругов к наложениям mapView после определенной задержки.
К сожалению, пользовательский интерфейс обновляется только после того, как пользователь убирает палец с экрана (ACTION_UP).
Вот пример кода:
Пользовательский интерфейс
if (event.getAction() == MotionEvent.ACTION_DOWN) {
handler = new OverlayHandler(mapView, centerDrawer) // centerDrawer is an overlay drawing a circle
cTask = new DrawTimer(handler); // Calls handler.sendMessage, telling the handler to add centerDraw to the overlays of mapView
handler.postDelayed(cTast, delay);
} else {
handler.removeCallbacks(cTask);
}
Таймер (DrawTimer и т. Д.)
public void run() {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
Обработчик
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
mapView.getOverlays().add(centerDrawer);
break;
// more cases
}
super.handleMessage(msg);
}
Насколько я знаю, это стандартный способ взаимодействия с пользовательским интерфейсом из фоновой задачи.
Это также верно для обновлений, когда пользователь взаимодействует с экраном?
Должен ли я явно указывать представлению для визуализации новых наложений?
EDIT:
Код должен делать следующее:
При касании он должен начать наблюдать, как долго пользователь продолжает касаться. После начальной задержки круг должен быть добавлен к виду. После еще одной задержки добавляется еще один оверлей и т. Д.
Я делаю это для каждого оверлея в два этапа:
Я добавляю Runnable к обработчику, который будет выполнен после задержки. Затем Runnable отправляет соответствующее сообщение обработчику, сообщая ему, что рисовать.
Я так делаю, потому что ...
- Мне нужно иметь возможность отменить таймер (сообщение), если пользователь перемещает или отпускает палец.
- Некоторые пометки должны меняться, когда пользователь продолжает касаться экрана. PostDelayed Runnable просто продолжает отправлять сообщения до отмены.
Вот почему я не просто использую отложенные сообщения.
Варианты использования
Пользователь касается экрана -> пользовательские выпуски до того, как проходит задержка (ничего не должно появляться)
Касание -> задержка прохождения -> круг -> отпускание
Касание -> задержка проходит -> кружок -> задержка 2 прохода -> кружок 2 -> отпускание