Google Map API V2-ユーザーが地図をスクロールしている間、画面の中央にマーカーを保持するにはどうすればよいですか?
私の目的は、ユーザーが場所を選択できるようにすることです。次のコードを使用してマーカーを追加します(これは、Android SDK)のcom.example.mapdemo
からのものです)
mMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
マーカーを画面の中央に置いて、その場所を取得するにはどうすればよいですか?
実際に画面の真ん中にマーカーを置いて簡単に浮かせることができるとは思いません。私の提案は、ユーザーをだますことです。ボタンのようにマーカー画像を地図に追加します。 xmlレイアウトを使用して、画面の中央に配置できます。次に、ユーザーが場所を選択したら、画面の中央からgps座標を取得します。
ちなみに、マーカーをドラッグ可能にすることもできます。その後、ユーザーはマーカーをマップ上でドラッグできます。
mMap.addMarker(new MarkerOptions().position(coordinate)
.title("Your Title")
.snippet("Please move the marker if needed.")
.draggable(true));
どうですか?
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
public void onCameraChange(CameraPosition arg0) {
mMap.clear();
mMap.addMarker(new MarkerOptions().position(arg0.target));
}
});
ユーザーが地図を移動するときの最良の選択肢はマーカーの移動だと思います...
googleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
@Override
public void onCameraMove() {
marker.setPosition(googleMap.getCameraPosition().target);//to center in map
}
});
//note marker is global
または単純な、レイアウトで、相対レイアウトでフラグメントを配置し、マーカーのアイコンの上に、マーカーが常にマップの中央にあることを計算します...
画面のサイズによって、これは複雑だと思いますが、マーカーが表示されるたびに電話が動くわけではありません...
これは、実際には、マップの上にカスタムビューをオーバーレイすることで可能になります。 Viewを拡張するクラスを作成し、ビューのdraw()メソッドとonTouchEvent()メソッドをオーバーライドして、マップの中央の上にマーカー(どのように見えるか)を描画することができます。ユーザーがマーカーを設定するときは、 projection を使用して、マーカーの画面上の位置をマップ上のLatLongに変換します。次に、地図上に適切なマーカーを設定できます(これは地理位置情報に固定されます)。
上記からわかるように、これは最も単純なプロセスではありません。実装を容易にするために、doubleAのソリューションを使用することをお勧めします。
これが解決策です
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);
}
});
}
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);
}
});
}
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のコールバックは中間フレームでは呼び出されないため、これはスムーズではありません。カメラが完全に変更された後にのみ呼び出されます。