osmdroid 批量添加标记和弹窗 并每秒刷新标记位置和弹窗信息 给出详细代码
以下是使用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_main和R.layout.popup_layout是根据你的布局文件命名而定的,你需要根据自己的布局文件进行相应的更改
原文地址: https://www.cveoy.top/t/topic/hxQE 著作权归作者所有。请勿转载和采集!