You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:15:37