У меня есть пользовательский интерфейс с MapFragment с прозрачным надписью сверху. Карта занимает весь экран, тогда как представление - это только левая треть экрана. В результате, по умолчанию "центр" карты отключен. Когда кто-то нажимает на маркер, я хочу центрировать этот маркер в полностью видимой области MapFragment (не в центре самого MapFragment).
Так как это сложно описать словами, позвольте мне использовать несколько снимков. Предположим, что так выглядит мой пользовательский интерфейс:
Когда пользователь нажимает маркер, я хочу как центрировать его, так и увеличивать масштаб, чтобы увидеть его ближе. Без каких-либо корректировок вы получите следующее:
Я хочу, чтобы маркер был центрирован, но в пространстве справа, например:
Очень легко достичь этого подвига, если вы не меняете уровень масштабирования с помощью проекции карты:
// Offset the target latitude/longitude by preset x/y ints
LatLng target = new LatLng(latitude, longitude);
Projection projection = getMap().getProjection();
Point screenLocation = projection.toScreenLocation(target);
screenLocation.x += offsetX;
screenLocation.y += offsetY;
LatLng offsetTarget = projection.fromScreenLocation(screenLocation);
// Animate to the calculated lat/lng
getMap().animateCamera(CameraUpdateFactory.newLatLng(offsetTarget));
Однако, если вы одновременно меняете уровень масштабирования, приведенные выше вычисления не работают (поскольку смещения lat/lng изменяются с разными уровнями масштабирования).
Позвольте мне запустить список попыток:
-
Быстрое изменение уровня масштабирования, выполнение вычислений, возврат к исходной позиции камеры, а затем анимация. К сожалению, внезапное изменение камеры (даже если это только на долю секунды), к сожалению, очень очевидно, и я бы хотел избежать мерцания.
-
Наложение двух MapFragments поверх друг друга, если вы выполните вычисления, пока отображается другое. Я обнаружил, что MapFragments на самом деле не построены, чтобы быть многослойными друг над другом (на этом пути есть неизбежные ошибки).
-
Изменение местоположения экрана x/y на разницу в квадрате уровня масштабирования. Теоретически это должно работать, но оно всегда отключается совсем немного (~.1 широта/долгота, которого достаточно, чтобы уйти).
Есть ли способ вычисления offsetTarget даже при изменении уровня масштабирования?