web-dev-qa-db-ja.com

Google Map API V2-ユーザーが地図をスクロールしている間、画面の中央にマーカーを保持するにはどうすればよいですか?

Google Map API V2-ユーザーが地図をスクロールしている間、画面の中央にマーカーを保持するにはどうすればよいですか?

私の目的は、ユーザーが場所を選択できるようにすることです。次のコードを使用してマーカーを追加します(これは、Android SDK)のcom.example.mapdemoからのものです)

mMap.addMarker(new MarkerOptions()
    .position(new LatLng(0, 0))
    .title("Marker"));

マーカーを画面の中央に置いて、その場所を取得するにはどうすればよいですか?

17
dong221

実際に画面の真ん中にマーカーを置いて簡単に浮かせることができるとは思いません。私の提案は、ユーザーをだますことです。ボタンのようにマーカー画像を地図に追加します。 xmlレイアウトを使用して、画面の中央に配置できます。次に、ユーザーが場所を選択したら、画面の中央からgps座標を取得します。

ちなみに、マーカーをドラッグ可能にすることもできます。その後、ユーザーはマーカーをマップ上でドラッグできます。

mMap.addMarker(new MarkerOptions().position(coordinate)
                    .title("Your Title")
                    .snippet("Please move the marker if needed.")
                    .draggable(true)); 
15
doubleA

どうですか?

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
        public void onCameraChange(CameraPosition arg0) {   
                mMap.clear();               
                mMap.addMarker(new MarkerOptions().position(arg0.target));
        }
});
9
Akexorcist

オプション1

ユーザーが地図を移動するときの最良の選択肢はマーカーの移動だと思います...

googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
            @Override
            public void onCameraMove() {
                marker.setPosition(googleMap.getCameraPosition().target);//to center in map
            }
        });
//note marker is global

オプション2

または単純な、レイアウトで、相対レイアウトでフラグメントを配置し、マーカーのアイコンの上に、マーカーが常にマップの中央にあることを計算します...

画面のサイズによって、これは複雑だと思いますが、マーカーが表示されるたびに電話が動くわけではありません...

4
DarckBlezzer

これは、実際には、マップの上にカスタムビューをオーバーレイすることで可能になります。 Viewを拡張するクラスを作成し、ビューのdraw()メソッドとonTouchEvent()メソッドをオーバーライドして、マップの中央の上にマーカー(どのように見えるか)を描画することができます。ユーザーがマーカーを設定するときは、 projection を使用して、マーカーの画面上の位置をマップ上のLatLongに変換します。次に、地図上に適切なマーカーを設定できます(これは地理位置情報に固定されます)。

上記からわかるように、これは最も単純なプロセスではありません。実装を容易にするために、doubleAのソリューションを使用することをお勧めします。

2
gsysko

これが解決策です

    private GoogleMap mMap;
    private Marker markerCenter;

    @Override
    public void onMapReady(GoogleMap googleMap) {

       mMap = googleMap; 

       MarkerOptions markerOptions = new MarkerOptions();
       markerOptions.position(mMap.getCameraPosition().target);
       markerCenter = mMap.addMarker(markerOptions);

       mMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
          public void onCameraMove() {
              markerCenter.setPosition(mMap.getCameraPosition().target);
          }
       });

    }
2
Andres Marin

AddMarkerを呼び出すときにマーカー参照を取得します。カメラが移動したら、マーカーをカメラから返されたtargetの位置に移動します。

private Marker marker;

public void onMapReady(final GoogleMap googleMap) {
        LatLng sydney = new LatLng(-34, 151);
        MarkerOptions markerOptions = new MarkerOptions().position(sydney).title("Marker in Sydney");
        marker = googleMap.addMarker(markerOptions);
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
        googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
            @Override
            public void onCameraMove() {
                final LatLng target = googleMap.getCameraPosition().target;
                marker.setPosition(target);
            }
        });
}
0
mabg
Marker marker;//have a instance variable marker
mMap.setOnCameraChangeListener(new OnCameraChangeListener();
public void onCameraChange(CameraPosition cameraPosition) {   
                MarkerOptions options = new MarkerOptions()
                                        .position(cameraPosition.target);

                 if(marker != null){marker.remove();}
                 marker = mMap.addMarker(options);
}

OnCameraChangeのコールバックは中間フレームでは呼び出されないため、これはスムーズではありません。カメラが完全に変更された後にのみ呼び出されます。

0
nagSumanth