以下是使用osmdroid库批量添加标记和弹窗,并每秒刷新标记位置和弹窗信息的示例代码:

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import org.osmdroid.api.IMapController;
import org.osmdroid.config.Configuration;
import org.osmdroid.events.MapEventsReceiver;
import org.osmdroid.events.MapListener;
import org.osmdroid.library.BuildConfig;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.overlay.gestures.RotationGestureOverlay;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements MapEventsReceiver {

    private MapView map;
    private IMapController mapController;
    private ItemizedOverlay<OverlayItem> markersOverlay;
    private List<OverlayItem> markersList;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 初始化osmdroid配置
        Context ctx = getApplicationContext();
        Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));

        setContentView(R.layout.activity_main);

        map = findViewById(R.id.map);
        map.setTileSource(TileSourceFactory.MAPNIK);
        map.setMultiTouchControls(true);
        map.setBuiltInZoomControls(true);

        RotationGestureOverlay rotationGestureOverlay = new RotationGestureOverlay(map);
        rotationGestureOverlay.setEnabled(true);
        map.getOverlays().add(rotationGestureOverlay);

        mapController = map.getController();
        mapController.setZoom(10.0);

        GeoPoint startPoint = new GeoPoint(40.7128, -74.0060);
        mapController.setCenter(startPoint);

        markersList = new ArrayList<>();
        markersOverlay = new ItemizedIconOverlay<>(markersList,
                new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                    @Override
                    public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                showPopup(item);
                            }
                        });
                        return true;
                    }

                    @Override
                    public boolean onItemLongPress(final int index, final OverlayItem item) {
                        return false;
                    }
                }, getApplicationContext());

        map.getOverlays().add(markersOverlay);

        handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                refreshMarkers();
                handler.postDelayed(this, 1000); // 每秒刷新一次
            }
        }, 1000); // 延迟1秒开始刷新
    }

    private void refreshMarkers() {
        // 在此处更新标记位置和弹窗信息
        for (OverlayItem item : markersList) {
            item.setPoint(new GeoPoint(item.getPoint().getLatitude() + 0.001, item.getPoint().getLongitude() + 0.001));
        }
        markersOverlay.populateNow();
    }

    private void showPopup(OverlayItem item) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.popup_layout, null);
        dialogBuilder.setView(dialogView);

        TextView titleTextView = dialogView.findViewById(R.id.titleTextView);
        TextView snippetTextView = dialogView.findViewById(R.id.snippetTextView);

        titleTextView.setText(item.getTitle());
        snippetTextView.setText(item.getSnippet());

        AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.show();
    }
}

请注意,上述代码中的R.layout.activity_mainR.layout.popup_layout是根据你的布局文件命名而定的,你需要根据自己的布局文件进行相应的更改

osmdroid 批量添加标记和弹窗 并每秒刷新标记位置和弹窗信息 给出详细代码

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

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