以下是Android OsmDroid批量添加多种标记和弹窗的示例代码,同时还包括位置和弹窗信息实时刷新的优化:

  1. 首先,在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'
}
  1. 在布局文件中添加MapView:
<org.osmdroid.views.MapView
    android:id="@+id/mapView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  1. 在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();
    }
}
  1. 优化:使用集合管理标记和弹窗,并实现位置和弹窗信息的实时刷新:
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 著作权归作者所有。请勿转载和采集!

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