0

我有一个 MapActivity,旨在显示由实例变量 mCenterPoint、mLatSpan 和 mLongSpan 定义的特定区域。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

我认为问题在于,mMap.getLatSpan()如果mMap.getLongSpan()您在开始时调用该方法,则返回 0 onCreate,如果您在 postdelay 可运行中进行计算,则它必须工作。

在这里你可以找到更好的答案:

Mapview getLatitudeSpan 和 getLongitudeSpan 不起作用

我用来在两个位置之间居中和缩放的代码:

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 回答