MapController setCenter 不起作用

MapController setCenter doesn't work

我有一个 GeoPoint gPt 坐标为 55.790833, 49.114444。我将那个东西添加到地图中并尝试居中。但是我的标记不在地图的中心(它稍微高一点)。

怎么了?

这是我的代码:

mResourceProxy = new ResourceProxyImpl(this.getActivity().getApplicationContext());
        mapView = (MapView) v.findViewById(R.id.mapview);
        mapView.setTileSource(TileSourceFactory.MAPNIK);
        mapView.setBuiltInZoomControls(true);
        mMapController = mapView.getController();
        mMapController.setZoom(15);
        GeoPoint gPt = new GeoPoint(55.790833, 49.114444);
        ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();        
        items.add(new OverlayItem("Here", "SampleDescription", gPt));

        mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
                new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                    @Override
                    public boolean onItemSingleTapUp(final int index,
                            final OverlayItem item) {

                        return true; // We 'handled' this event.
                    }

                    @Override
                    public boolean onItemLongPress(final int index,
                            final OverlayItem item) {

                        return false;
                    }
                }, mResourceProxy);
        mapView.getOverlays().add(this.mMyLocationOverlay);
        mapView.invalidate();

        mMapController.setCenter(gPt);  

编辑:

如果您懒得更新 osmdroid,只需添加以下语句:

ViewTreeObserver vto = v.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new       ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mapView.getController().setCenter(gPt);
            }
        });

"What is wrong?"

=> 当然是你的 osmdroid 版本,issue #22

升级到 v4.3。

我知道这个问题比较老,已经回答了,但是对于那些在 Xamarin 工作并且由于 Xamarin 组件已经过时而不能使用 4.2 版本而受到限制的人,请使用下面的解决方案,感谢 Tony of当然..

GeoPoint gp = new GeoPoint(lat, lng);
ViewTreeObserver vto = _mapView.ViewTreeObserver;
vto.GlobalLayout += (sender, args) =>
{
    _mapView.Controller.SetCenter(gp);
};

可能是因为你在布局地图之前调用了setCenter()

尝试以下选项之一:

  1. 在代码中某处调用 setCenter(),您可以确定地图的布局
  2. 覆盖地图的onLayout
  3. 触发一个异步任务

    @SuppressLint("StaticFieldLeak") AsyncTask<Void,Void,Void> waitForSize = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... voids) {
        while(mapView.getWidth() == 0){
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
            }
        }
        return null;
    }
    
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        mapView.getController().setCenter(myLocation);
    }
    

    };

waitForSize.execute();