能否在OSMdroid中为每个Marker绘制两个自定义信息窗口?
在OSMdroid中为单个Marker实现双信息窗口
OSMdroid原生的Marker类仅支持绑定一个InfoWindow,但可以通过自定义扩展或者叠加Marker的方式实现你需要的双信息窗口效果,下面是两种可行方案:
方案一:自定义支持双窗口的Marker类
扩展原生Marker,添加两个信息窗口的引用,通过点击切换显示不同窗口:
public class DualWindowMarker extends Marker { private InfoWindow mWindowA; private InfoWindow mWindowB; private boolean mShowWindowA = true; public DualWindowMarker(MapView mapView) { super(mapView); // 初始化两个自定义信息窗口,替换成你自己的布局 mWindowA = new BasicInfoWindow(R.layout.info_window_a, mapView); mWindowB = new BasicInfoWindow(R.layout.info_window_b, mapView); setOnMarkerClickListener(this::handleMarkerClick); } private boolean handleMarkerClick(Marker marker, MapView mapView) { // 先关闭当前显示的窗口 if (getInfoWindow() != null) getInfoWindow().close(); // 切换显示另一个窗口,通过偏移参数调整窗口位置避免遮挡Marker if (mShowWindowA) { mWindowA.open(this, getPosition(), 0, -50); } else { mWindowB.open(this, getPosition(), 0, -100); } mShowWindowA = !mShowWindowA; return true; } }
方案二:叠加两个位置重合的Marker
创建两个完全重合的Marker,分别绑定不同的信息窗口,通过不同交互触发:
// 主Marker,点击显示第一个窗口 Marker markerMain = new Marker(mapView); markerMain.setPosition(new GeoPoint(39.9042, 116.4074)); // 替换成你的目标坐标 markerMain.setInfoWindow(new BasicInfoWindow(R.layout.info_main, mapView)); markerMain.setTitle("主信息窗口"); // 辅助Marker,设置透明图标避免遮挡主Marker,长按触发第二个窗口 Marker markerAux = new Marker(mapView); markerAux.setPosition(markerMain.getPosition()); markerAux.setInfoWindow(new BasicInfoWindow(R.layout.info_aux, mapView)); markerAux.setIcon(IconFactory.getInstance(mapView).createBitmap(Color.TRANSPARENT, 1, 1)); markerAux.setOnMarkerLongClickListener((marker, map) -> { markerAux.showInfoWindow(); return true; }); // 将两个Marker添加到地图图层 mapView.getOverlays().add(markerMain); mapView.getOverlays().add(markerAux);
关键注意点
- 调整信息窗口的显示偏移(
open()方法的最后两个参数),让两个窗口不会互相遮挡 - 处理全局关闭事件:比如点击地图空白处时,确保两个窗口都关闭,可通过监听
MapView的触摸事件实现 - 自定义信息窗口布局时,直接继承
BasicInfoWindow并传入自定义布局ID即可
内容的提问来源于stack exchange,提问作者Oleh Liskovych
相关产品推荐
相关产品推荐

