Android OsmDroid 批量添加多种标记和弹窗,并实现实时刷新
以下是Android OsmDroid批量添加多种标记和弹窗的示例代码,同时还包括位置和弹窗信息实时刷新的优化:
- 首先,在build.gradle文件中添加依赖项:
dependencies {
implementation 'org.osmdroid:osmdroid-android:6.0.3'
implementation 'org.osmdroid:osmdroid-mapsforge:6.0.3'
implementation 'org.osmdroid:osmdroid-geopackage:6.0.3'
}
- 在布局文件中添加MapView:
<org.osmdroid.views.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 在Activity中初始化MapView并添加标记和弹窗:
public class MainActivity extends AppCompatActivity {
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化MapView
mapView = findViewById(R.id.mapView);
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setBuiltInZoomControls(true);
mapView.setMultiTouchControls(true);
// 创建标记和弹窗
Marker marker1 = new Marker(mapView);
marker1.setPosition(new GeoPoint(39.9042, 116.4074)); // 设置位置
marker1.setTitle('Marker 1'); // 设置标题
marker1.setSnippet('This is marker 1'); // 设置内容
marker1.setIcon(getResources().getDrawable(R.drawable.marker1)); // 设置图标
Marker marker2 = new Marker(mapView);
marker2.setPosition(new GeoPoint(31.2304, 121.4737));
marker2.setTitle('Marker 2');
marker2.setSnippet('This is marker 2');
marker2.setIcon(getResources().getDrawable(R.drawable.marker2));
InfoWindow infoWindow1 = new InfoWindow(); // 创建弹窗
infoWindow1.setTitle('Info Window 1'); // 设置标题
infoWindow1.setContent('This is info window 1'); // 设置内容
InfoWindow infoWindow2 = new InfoWindow();
infoWindow2.setTitle('Info Window 2');
infoWindow2.setContent('This is info window 2');
// 将标记和弹窗添加到MapView
mapView.getOverlays().add(marker1);
mapView.getOverlays().add(marker2);
mapView.getOverlays().add(infoWindow1);
mapView.getOverlays().add(infoWindow2);
// 刷新MapView
mapView.invalidate();
}
}
- 优化:使用集合管理标记和弹窗,并实现位置和弹窗信息的实时刷新:
public class MainActivity extends AppCompatActivity {
private MapView mapView;
private List<Marker> markerList;
private List<InfoWindow> infoWindowList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化MapView
mapView = findViewById(R.id.mapView);
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setBuiltInZoomControls(true);
mapView.setMultiTouchControls(true);
// 创建标记和弹窗集合
markerList = new ArrayList<>();
infoWindowList = new ArrayList<>();
// 添加标记和弹窗到集合中
Marker marker1 = createMarker(39.9042, 116.4074, 'Marker 1', 'This is marker 1', R.drawable.marker1);
Marker marker2 = createMarker(31.2304, 121.4737, 'Marker 2', 'This is marker 2', R.drawable.marker2);
markerList.add(marker1);
markerList.add(marker2);
InfoWindow infoWindow1 = createInfoWindow('Info Window 1', 'This is info window 1');
InfoWindow infoWindow2 = createInfoWindow('Info Window 2', 'This is info window 2');
infoWindowList.add(infoWindow1);
infoWindowList.add(infoWindow2);
// 将标记和弹窗添加到MapView
mapView.getOverlays().addAll(markerList);
mapView.getOverlays().addAll(infoWindowList);
// 刷新MapView
mapView.invalidate();
// 实时刷新标记和弹窗位置和内容
mapView.addOnFirstLayoutListener(new MapView.OnFirstLayoutListener() {
@Override
public void onFirstLayout(View v, int left, int top, int right, int bottom) {
for (Marker marker : markerList) {
GeoPoint geoPoint = marker.getPosition();
int x = mapView.getProjection().toPixels(geoPoint, null).x - marker.getIcon().getIntrinsicWidth() / 2;
int y = mapView.getProjection().toPixels(geoPoint, null).y - marker.getIcon().getIntrinsicHeight() / 2;
marker.setPosition(mapView.getProjection().fromPixels(x, y));
}
for (InfoWindow infoWindow : infoWindowList) {
infoWindow.close();
infoWindow.open(markerList.get(infoWindowList.indexOf(infoWindow)), mapView, true);
}
}
});
}
// 创建标记方法
private Marker createMarker(double latitude, double longitude, String title, String snippet, int iconResId) {
Marker marker = new Marker(mapView);
marker.setPosition(new GeoPoint(latitude, longitude));
marker.setTitle(title);
marker.setSnippet(snippet);
marker.setIcon(getResources().getDrawable(iconResId));
return marker;
}
// 创建弹窗方法
private InfoWindow createInfoWindow(String title, String content) {
InfoWindow infoWindow = new InfoWindow();
infoWindow.setTitle(title);
infoWindow.setContent(content);
return infoWindow;
}
}
原文地址: http://www.cveoy.top/t/topic/oXeA 著作权归作者所有。请勿转载和采集!