0

インスタンス変数 mCenterPoint、mLatSpan、および mLongSpan で定義された特定の領域を表示するための MapActivity があります。Map オブジェクトには、マップの緯度スパンと経度スパンだけでなく、中心点を取得するメソッドがあります。MapActivity が開かれたら、すぐに中心点を中心にして正しい範囲にズームしたいと考えています。

これが私の onCreate メソッドと私の setRegionOfMap メソッドです:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.google_map);

    mMapView = (MapView) findViewById(R.id.mapview);
    mMapView.setBuiltInZoomControls(true);

    setRegionOfMap();

}
private void setRegionOfMap(){
    mMapView.getController().setCenter(mCenterPoint);
    mMapView.getController().zoomToSpan(mLatSpan, mLongSpan);
}

mMap は、私のマップ オブジェクトの単なるインスタンスです。データは動的に変化しないため、中心点とスパンは常に同じ値です。約 1/4 から 1/2 の時間で、マップが期待どおりに正確にズームされます。それでも、ズームアウトしすぎていることを除いて、マップは正しく中央に配置されているように見えます。MapView が一部の時間だけズームし、他の時間は正しくないのはなぜですか? 私の唯一の理論は、 zoomToSpan 呼び出しが発生したときにマップが完全に描画されていない可能性があるため、ズームが登録されないということでした。ただし、その理論をテストすることはできませんでした。

4

2 に答える 2

1

OnGlobalLayoutListenerからzoomToSpanを呼び出すことで、これを自分で解決することになりました。以前の問題は、onCreate() でマップがまだ描画されていなかったため、ズームの効果がなかったことです。このリスナーから zoomToSpan を呼び出すと、マップが設定され、ズームが有効になります。これが私の「setRegionOfMap()」メソッドです。

    private void setRegionOfMap(){
    final LinearLayout layout = (LinearLayout)findViewById(R.id.outdoor_maps_linearlayout);
    final ViewTreeObserver vto = layout.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
        @Override 
        public void onGlobalLayout() { 
            layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
            MapView mapView = (MapView)layout.findViewById(R.id.mapview);
            mapView.getController().setCenter(mCenterPoint);
            mapView.getController().zoomToSpan(mLatSpan, mLongSpan);
        } 
    });
}
于 2012-07-25T18:12:44.510 に答える
0

問題は、 start でメソッドを呼び出すと 0 が返されることだmMap.getLatSpan()と思います。 postdelay runnable で計算する場合は、機能する必要があります。mMap.getLongSpan()onCreate

ここでより良い答えを見つけることができます:

Mapview getLatitudeSpan と getLongitudeSpan が機能しない

2つの場所の間で中央に配置してズームするために使用するコード:

if (searchedLocationFrom != null && searchedLocationTo != null) { // center

            int lat1 = (int) (searchedLocationFrom.getLatitude() * 1E6);
            int lon1 = (int) (searchedLocationFrom.getLongitude() * 1E6);
            int lat2 = (int) (searchedLocationTo.getLatitude() * 1E6);
            int lon2 = (int) (searchedLocationTo.getLongitude() * 1E6);

            // mapController.setZoom(13);
            mapController.zoomToSpan((lat1 > lat2 ? lat1 - lat2 : lat2
                    - lat1), (lon1 > lon2 ? lon1 - lon2 : lon2 - lon1));
            int z = mapView.getZoomLevel();
            mapController.setZoom(z > 1 ? z - 1 : z);
            mapController
                    .setCenter(new GeoPoint(lat1 - ((lat1 - lat2) / 2),
                            lon1 - ((lon1 - lon2) / 2)));
        }

お役に立てれば幸いです:)

于 2012-07-17T19:02:38.347 に答える