小さいAndroid問題(google maps v2 api)があります
これは私のコードです:
GoogleMaps mMap;
Marker marker = mMap.addMarker(new MarkerOptions().position(new LatLng(20, 20)));
このマーカーオブジェクトの現在の画面座標(x、y)を取得する方法を探しています。
おそらく誰かがアイデアを持っていますか? getProjectionを試してみましたが、動作しないようです。ありがとう! :)
はい、Projection
クラスを使用します。すなわち:
マップのProjection
を取得します。
_Projection projection = map.getProjection();
_
マーカーの位置を取得します。
_LatLng markerLocation = marker.getPosition();
_
Projection.toScreenLocation()
メソッドに場所を渡します:
_Point screenPosition = projection.toScreenLocation(markerLocation);
_
それで全部です。 screenPosition
には、Mapコンテナ全体の左上隅に対するマーカーの位置が含まれます:)
Projection
オブジェクトは有効な値のみを返すことに注意してくださいマップがレイアウトプロセスを通過した後(つまり、有効なwidth
およびheight
セットがあります)。次のシナリオのように、マーカーの位置にすぐにアクセスしようとしているため、おそらく_(0, 0)
_を取得しています。
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);
}
});
}
_
追加情報については、コメントをお読みください。