Как получить координаты экрана с маркера в google maps v2 android

У меня небольшая проблема с Android (google maps v2 api)

Это мой код:

GoogleMaps mMap;
Marker marker =  mMap.addMarker(new MarkerOptions().position(new LatLng(20, 20)));

Я пытаюсь найти способ получить текущие координаты экрана (x, y) для этого объекта маркера.

Возможно, у кого-то есть идея? Я попробовал getProjection, но он не работает. Благодарю!:)

Ответ 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);
        }
    });
}

Прочитайте комментарии для дополнительной информации.