要保证一个图标只有一个弹窗,并且刷新时不会新建弹窗,可以使用osmdroid的Marker类来实现。下面是一个示例代码:

import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Marker;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.overlay.infowindow.InfoWindow;

public class CustomMarker extends Marker {
    private InfoWindow mInfoWindow;

    public CustomMarker(MapView mapView) {
        super(mapView);
    }

    public CustomMarker(MapView mapView, InfoWindow infoWindow) {
        super(mapView);
        mInfoWindow = infoWindow;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event, MapView mapView) {
        if (mInfoWindow != null) {
            if (isInfoWindowShown()) {
                closeInfoWindow();
            } else {
                showInfoWindow();
            }
            return true;
        }
        return super.onSingleTapConfirmed(event, mapView);
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);
        if (isInfoWindowShown() && mInfoWindow != null) {
            mInfoWindow.draw(mMapView, canvas, mapView.getProjection());
        }
    }
}

在上面的示例代码中,自定义了一个CustomMarker类,继承自osmdroid的Marker类。在构造方法中可以传入一个InfoWindow对象,用于显示弹窗内容。在onSingleTapConfirmed方法中,判断是否已经显示了弹窗,如果是则关闭弹窗,否则显示弹窗。在draw方法中,如果弹窗已经显示,则调用InfoWindow的draw方法绘制弹窗。

使用时,可以在创建Marker时传入一个InfoWindow对象,然后添加到MapView的Overlay中,如下所示:

InfoWindow infoWindow = new InfoWindow(R.layout.custom_infowindow, mapView);
CustomMarker marker = new CustomMarker(mapView, infoWindow);
marker.setPosition(new GeoPoint(0, 0));
mapView.getOverlays().add(marker);

这样就可以保证一个图标只有一个弹窗,并且刷新时不会新建弹窗,从而减少内存增加和泄漏的问题

osmdroid如何保证一个图标只有一个弹窗 刷新也不会新建。 减少内存增加和泄漏给出详细代码

原文地址: https://www.cveoy.top/t/topic/hHms 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录