35

私は小さなアンドロイドの問題を抱えています(グーグルマップv2API)

これは私のコードです:

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

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

おそらく誰かがアイデアを持っていますか?getProjectionを試しましたが、機能しません。ありがとう!:)

4

2 に答える 2

87

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

  1. Projection地図を入手する:

    Projection projection = map.getProjection();
    
  2. マーカーの場所を取得します。

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

    Point screenPosition = projection.toScreenLocation(markerLocation);
    

それで全部です。screenPositionこれで、マップコンテナ全体の左上隅を基準にしたマーカーの位置が含まれます:)

編集

オブジェクトは、マップがレイアウトプロセスを通過した後(つまり、有効で設定された後)Projectionにのみ有効な値を返すことに注意してください。このシナリオのように、マーカーの位置にすぐにアクセスしようとしているため、おそらく取得しています。widthheight(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);
        }
    });
}

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

于 2013-01-20T22:40:24.860 に答える
1

toScreenLocationは、投影用にfromLatLngToPoint gmaps api docに置き換えられたようです:https ://developers.google.com/maps/documentation/javascript/reference/image-overlay#Projection

于 2020-08-15T01:44:04.953 に答える