调整地图以包含标记信息 window
Adjust map to contain marker info window
我正在使用 osmdroid 和 osmbonuspack 库。在 activity 中,我有一张地图,其中包含来自 osmbonuspack 的多个标记,点击时每个标记都会打开一个信息窗口。但是当标记靠近 MapView 的上边缘时,它的信息窗口会打开超出范围。有没有一种方法可以调整地图视图,以便像 iOS 库一样完全显示标记的信息窗口? https://www.mapbox.com/ios-sdk/examples/marker/
我通过覆盖标准的 MarkerInfoWindow onOpen 方法设法解决了这个问题:
@Override
public void onOpen(Object item) {
super.onOpen(item);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int[] infoWindowTop = {0, 0};
int[] mapViewTop = {0, 0};
mView.getLocationOnScreen(infoWindowTop);
mMapView.getLocationOnScreen(mapViewTop);
int rightEnd = infoWindowTop[0] + mView.getWidth();
int dy = infoWindowTop[1] - mapViewTop[1];
int dx = infoWindowTop[0];
int dx_right = mMapView.getWidth() - rightEnd;
if (dy < 0 && dx < 0) {
smoothScrollBy(mMapView, dx, dy);
return;
}
if (dy < 0 && dx_right < 0) {
smoothScrollBy(mMapView, -dx_right, dy);
return;
}
if (dx < 0) {
smoothScrollBy(mMapView, dx, 0);
return;
}
if (dy < 0) {
smoothScrollBy(mMapView, 0, dy);
return;
}
if (dx_right < 0) {
smoothScrollBy(mMapView, -dx_right, 0);
return;
}
}
}, 500);
}
我正在使用 osmdroid 和 osmbonuspack 库。在 activity 中,我有一张地图,其中包含来自 osmbonuspack 的多个标记,点击时每个标记都会打开一个信息窗口。但是当标记靠近 MapView 的上边缘时,它的信息窗口会打开超出范围。有没有一种方法可以调整地图视图,以便像 iOS 库一样完全显示标记的信息窗口? https://www.mapbox.com/ios-sdk/examples/marker/
我通过覆盖标准的 MarkerInfoWindow onOpen 方法设法解决了这个问题:
@Override
public void onOpen(Object item) {
super.onOpen(item);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int[] infoWindowTop = {0, 0};
int[] mapViewTop = {0, 0};
mView.getLocationOnScreen(infoWindowTop);
mMapView.getLocationOnScreen(mapViewTop);
int rightEnd = infoWindowTop[0] + mView.getWidth();
int dy = infoWindowTop[1] - mapViewTop[1];
int dx = infoWindowTop[0];
int dx_right = mMapView.getWidth() - rightEnd;
if (dy < 0 && dx < 0) {
smoothScrollBy(mMapView, dx, dy);
return;
}
if (dy < 0 && dx_right < 0) {
smoothScrollBy(mMapView, -dx_right, dy);
return;
}
if (dx < 0) {
smoothScrollBy(mMapView, dx, 0);
return;
}
if (dy < 0) {
smoothScrollBy(mMapView, 0, dy);
return;
}
if (dx_right < 0) {
smoothScrollBy(mMapView, -dx_right, 0);
return;
}
}
}, 500);
}