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()
尝试以下选项之一:
- 在代码中某处调用 setCenter(),您可以确定地图的布局
- 覆盖地图的onLayout
触发一个异步任务
@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();
我有一个 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()
尝试以下选项之一:
- 在代码中某处调用 setCenter(),您可以确定地图的布局
- 覆盖地图的onLayout
触发一个异步任务
@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();