Java 地图控制器设置中心不';行不通

Java 地图控制器设置中心不';行不通,java,android,openstreetmap,osmdroid,Java,Android,Openstreetmap,Osmdroid,我得到了一个地质点gPt,坐标为55.790833,49.114444。我将那个东西添加到地图上,并尝试居中。但我的标记不在地图的中心(它稍微高一点)。 怎么了 这是我的代码: mResourceProxy = new ResourceProxyImpl(this.getActivity().getApplicationContext()); mapView = (MapView) v.findViewById(R.id.mapview); mapView.se

我得到了一个地质点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版本,带有


升级到v4.3

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

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

这可能是因为在绘制地图之前调用了setCenter()

请尝试以下选项之一:

  • 在代码中的某个地方调用setCenter(),您可以确保地图已布置好
  • 覆盖地图的唯一布局
  • 触发异步任务

    @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);
    }
    
    @suppressint(“StaticFieldLeak”)AsyncTask waitForSize=new AsyncTask(){
    @凌驾
    受保护的空位背景(空位…空位){
    而(mapView.getWidth()==0){
    试一试{
    睡眠(1500);
    }捕捉(中断异常e){
    }
    }
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void避免){
    super.onPostExecute(避免);
    mapView.getController().setCenter(myLocation);
    }
    
    })

  • waitForSize.execute()

    @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);
    }