web-dev-qa-db-ja.com

Googleマップv2のマーカーから画面座標を取得する方法android

小さいAndroid問題(google maps v2 api)があります

これは私のコードです:

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

このマーカーオブジェクトの現在の画面座標(x、y)を取得する方法を探しています。

おそらく誰かがアイデアを持っていますか? getProjectionを試してみましたが、動作しないようです。ありがとう! :)

30
mangotasche

はい、Projectionクラスを使用します。すなわち:

  1. マップのProjectionを取得します。

    _Projection projection = map.getProjection();
    _
  2. マーカーの位置を取得します。

    _LatLng markerLocation = marker.getPosition();
    _
  3. Projection.toScreenLocation()メソッドに場所を渡します:

    _Point screenPosition = projection.toScreenLocation(markerLocation);
    _

それで全部です。 screenPositionには、Mapコンテナ全体の左上隅に対するマーカーの位置が含まれます:)

編集

Projectionオブジェクトは有効な値のみを返すことに注意してくださいマップがレイアウトプロセスを通過した後(つまり、有効なwidthおよびheightセットがあります)。次のシナリオのように、マーカーの位置にすぐにアクセスしようとしているため、おそらく_(0, 0)_を取得しています。

  1. レイアウトXMLファイルを展開してマップを作成します
  2. マップを初期化します。
  3. マップにマーカーを追加します。
  4. 画面上のマーカー位置について、マップのProjectionを照会します。

マップに有効な幅と高さが設定されていないため、これは良い考えではありません。これらの値が有効になるまで待つ必要があります。解決策の1つは、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);
        }
    });
}
_

追加情報については、コメントをお読みください。

79
andr