Osmdroid可以使用ItemizedOverlay类来批量加载大量标记和弹窗。以下是实现步骤:

  1. 创建一个类继承自ItemizedOverlay,重写其中的两个方法:
  • createItem(int index):该方法返回一个OverlayItem对象,该对象包含标记的位置、标题和描述信息。
  • onBalloonTap(int index, OverlayItem item):该方法在弹窗被点击时调用,可以在该方法中实现弹窗的具体操作。
  1. 在MapActivity的onCreate方法中创建自定义的ItemizedOverlay对象,并将其添加到MapView中。

  2. 在自定义的ItemizedOverlay类中,调用populate()方法,将所有的OverlayItem对象添加到ItemizedOverlay中。

以下是具体实现代码:

public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> mOverlayItems = new ArrayList<>();
    private Context mContext;

    public MyItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
    }

    @Override
    protected OverlayItem createItem(int index) {
        return mOverlayItems.get(index);
    }

    @Override
    public int size() {
        return mOverlayItems.size();
    }

    @Override
    protected boolean onTap(int index) {
        OverlayItem item = mOverlayItems.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
    }

    public void addOverlayItem(OverlayItem overlayItem) {
        mOverlayItems.add(overlayItem);
        populate();
    }
}

在MapActivity中使用:

public class MainActivity extends AppCompatActivity{
    private MapView mMapView;
    private MyItemizedOverlay mItemizedOverlay;
    private ArrayList<OverlayItem> mOverlayItems = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMapView = findViewById(R.id.mapView);
        mMapView.setTileSource(TileSourceFactory.MAPNIK);

        mItemizedOverlay = new MyItemizedOverlay(getResources().getDrawable(R.drawable.marker), this);
        mMapView.getOverlays().add(mItemizedOverlay);

        // 批量添加标记和弹窗
        for (int i = 0; i < 100; i++) {
            GeoPoint point = new GeoPoint(39.9 + Math.random(), 116.3 + Math.random());
            OverlayItem item = new OverlayItem('Title ' + i, 'Snippet ' + i, point);
            mOverlayItems.add(item);
        }
        mItemizedOverlay.addOverlayItems(mOverlayItems);

        mMapView.getController().setZoom(10);
        mMapView.getController().setCenter(mOverlayItems.get(0).getPoint());
    }
}
Android 地图开发:使用 Osmdroid 批量加载大量标记和弹窗

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

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