Android 地图开发:使用 Osmdroid 批量加载大量标记和弹窗
Osmdroid可以使用ItemizedOverlay类来批量加载大量标记和弹窗。以下是实现步骤:
- 创建一个类继承自ItemizedOverlay,重写其中的两个方法:
- createItem(int index):该方法返回一个OverlayItem对象,该对象包含标记的位置、标题和描述信息。
- onBalloonTap(int index, OverlayItem item):该方法在弹窗被点击时调用,可以在该方法中实现弹窗的具体操作。
-
在MapActivity的onCreate方法中创建自定义的ItemizedOverlay对象,并将其添加到MapView中。
-
在自定义的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());
}
}
原文地址: https://www.cveoy.top/t/topic/oZKW 著作权归作者所有。请勿转载和采集!