Android Osmdroid 批量添加多种标记和弹窗,样式不同,实时更新位置和信息
您可以使用 Osmdroid 的 Overlay 和 OverlayItem 来实现批量添加多种标记和弹窗,样式不同,不同的标记放入相同的图层进行管理,对位置和弹窗信息实时刷新的功能。
以下是基本的步骤:
- 创建自定义 Overlay 类,继承自 ItemizedOverlay 类,用于管理多个 OverlayItem。
public class CustomOverlay extends ItemizedOverlay<OverlayItem> {
// 构造函数
public CustomOverlay(Drawable defaultMarker, Context context) {
super(defaultMarker, new DefaultResourceProxyImpl(context));
}
// 添加 OverlayItem
public void addItem(OverlayItem item) {
mOverlayItems.add(item);
populate();
}
// 清除所有 OverlayItem
public void clearItems() {
mOverlayItems.clear();
populate();
}
// 重写 createItem 方法,返回 OverlayItem
@Override
protected OverlayItem createItem(int index) {
return mOverlayItems.get(index);
}
// 返回 OverlayItem 个数
@Override
public int size() {
return mOverlayItems.size();
}
}
- 创建多个 OverlayItem 对象,并添加到自定义 Overlay 中。
CustomOverlay overlay = new CustomOverlay(getResources().getDrawable(R.drawable.marker), this);
List<OverlayItem> items = new ArrayList<>();
// 创建多个 OverlayItem
items.add(new OverlayItem('Title1', 'Snippet1', new GeoPoint(30.12345, 120.67890)));
items.add(new OverlayItem('Title2', 'Snippet2', new GeoPoint(30.23456, 120.78901)));
items.add(new OverlayItem('Title3', 'Snippet3', new GeoPoint(30.34567, 120.89012)));
// 将 OverlayItem 添加到自定义 Overlay 中
for (OverlayItem item : items) {
overlay.addItem(item);
}
- 将自定义 Overlay 添加到 MapView 中。
// 获取 MapView 对象
MapView mapView = findViewById(R.id.map_view);
// 添加自定义 Overlay
mapView.getOverlays().add(overlay);
- 实现 OverlayItem 的点击事件,显示弹窗。
// 实现 OverlayItem 点击事件
overlay.setOnItemGestureListener(new ItemizedOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
// 显示弹窗
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(item.getTitle());
builder.setMessage(item.getSnippet());
builder.setPositiveButton('确认', null);
builder.show();
return true;
}
@Override
public boolean onItemLongPress(final int index, final OverlayItem item) {
return false;
}
});
- 实时更新 OverlayItem 的位置和弹窗信息。
// 更新 OverlayItem 位置
GeoPoint point = new GeoPoint(30.45678, 120.90123);
overlay.getItem(0).setPoint(point);
// 更新 OverlayItem 弹窗信息
overlay.getItem(0).setTitle('New Title');
overlay.getItem(0).setSnippet('New Snippet');
// 刷新自定义 Overlay
overlay.refresh();
通过以上步骤,您就可以实现批量添加多种标记和弹窗,样式不同,不同的标记放入相同的图层进行管理,对位置和弹窗信息实时刷新的功能。
原文地址: http://www.cveoy.top/t/topic/oXdw 著作权归作者所有。请勿转载和采集!