Ответ 1
Да, используйте класс Projection
. Более конкретно:
-
Получите
Projection
карты:Projection projection = map.getProjection();
-
Получить местоположение вашего маркера:
LatLng markerLocation = marker.getPosition();
-
Перейдите к методу
Projection.toScreenLocation()
:Point screenPosition = projection.toScreenLocation(markerLocation);
Это все. Теперь screenPosition
будет содержать положение маркера относительно верхнего левого угла всего контейнера карты:)
Изменить
Помните, что объект Projection
будет возвращать только допустимые значения после того, как карта прошла процесс компоновки (т.е. имеет действительный набор width
и height
). Вероятно, вы получаете (0, 0)
, потому что вы слишком быстро пытаетесь получить доступ к позиции маркеров, как в этом случае:
- Создайте карту из XML файла макета, раздувая его
- Инициализировать карту.
- Добавить маркеры на карту.
- Запрос
Projection
карты для позиций маркеров на экране.
Это не очень хорошая идея, так как карта не имеет действительной ширины и высоты. Вы должны подождать, пока эти значения не будут действительны. Одним из решений является привязка OnGlobalLayoutListener
к виду карты и ожидание процесса компоновки. Сделайте это после раздувания макета и инициализации карты - например, в onCreate()
:
// map is the GoogleMap object
// marker is Marker object
// ! here, map.getProjection().toScreenLocation(marker.getPosition()) will return (0, 0)
// R.id.map is the ID of the MapFragment in the layout XML file
View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
if (mapView.getViewTreeObserver().isAlive()) {
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// remove the listener
// ! before Jelly Bean:
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
// ! for Jelly Bean and later:
//mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// set map viewport
// CENTER is LatLng object with the center of the map
map.moveCamera(CameraUpdateFactory.newLatLngZoom(CENTER, 15));
// ! you can query Projection object here
Point markerScreenPosition = map.getProjection().toScreenLocation(marker.getPosition());
// ! example output in my test code: (356, 483)
System.out.println(markerScreenPosition);
}
});
}
Прочитайте комментарии для дополнительной информации.