android osmdroid批量添加不同的标记和弹窗不同的标记用不同的图片展示 给出详细代码
以下是使用osmdroid批量添加不同的标记和弹窗的详细代码:
- 添加依赖项
在build.gradle文件中添加以下依赖项:
dependencies {
implementation 'org.osmdroid:osmdroid-android:6.1.5'
implementation 'org.osmdroid:osmdroid-mapsforge:6.1.5'
}
- 准备标记图片和数据
在drawable文件夹中添加不同的标记图片,如marker1.png、marker2.png等。
准备需要展示的数据,例如一个列表List
- 创建MapView和MapController对象
在布局文件中添加MapView控件,创建MapView和MapController对象:
private MapView mapView;
private MapController mapController;
mapView = findViewById(R.id.map_view);
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
mapController.setZoom(12.0);
- 添加标记和弹窗
遍历myDataList列表,创建OverlayItem对象,设置经纬度、标题、内容和标记图片等属性,将OverlayItem添加到ItemizedIconOverlay对象中,最后将ItemizedIconOverlay对象添加到MapView中:
ItemizedIconOverlay<OverlayItem> itemizedIconOverlay = new ItemizedIconOverlay<>(new ArrayList<OverlayItem>(), null, null);
for (MyData myData : myDataList) {
GeoPoint geoPoint = new GeoPoint(myData.getLatitude(), myData.getLongitude());
OverlayItem overlayItem = new OverlayItem(myData.getTitle(), myData.getContent(), geoPoint);
Drawable marker = getResources().getDrawable(R.drawable.marker1);
overlayItem.setMarker(marker);
itemizedIconOverlay.addItem(overlayItem);
}
mapView.getOverlays().add(itemizedIconOverlay);
此外,还可以添加弹窗的点击事件,当用户点击标记时弹出弹窗展示更多信息:
itemizedIconOverlay.setOnItemGestureListener(new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(int index, OverlayItem item) {
new AlertDialog.Builder(MainActivity.this)
.setTitle(item.getTitle())
.setMessage(item.getSnippet())
.setPositiveButton("OK", null)
.show();
return true;
}
@Override
public boolean onItemLongPress(int index, OverlayItem item) {
return false;
}
});
完整代码如下所示:
public class MainActivity extends AppCompatActivity {
private MapView mapView;
private MapController mapController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.map_view);
mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
mapController.setZoom(12.0);
List<MyData> myDataList = prepareData();
ItemizedIconOverlay<OverlayItem> itemizedIconOverlay = new ItemizedIconOverlay<>(new ArrayList<OverlayItem>(), null, null);
for (MyData myData : myDataList) {
GeoPoint geoPoint = new GeoPoint(myData.getLatitude(), myData.getLongitude());
OverlayItem overlayItem = new OverlayItem(myData.getTitle(), myData.getContent(), geoPoint);
Drawable marker = getResources().getDrawable(R.drawable.marker1);
overlayItem.setMarker(marker);
itemizedIconOverlay.addItem(overlayItem);
}
itemizedIconOverlay.setOnItemGestureListener(new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(int index, OverlayItem item) {
new AlertDialog.Builder(MainActivity.this)
.setTitle(item.getTitle())
.setMessage(item.getSnippet())
.setPositiveButton("OK", null)
.show();
return true;
}
@Override
public boolean onItemLongPress(int index, OverlayItem item) {
return false;
}
});
mapView.getOverlays().add(itemizedIconOverlay);
}
private List<MyData> prepareData() {
List<MyData> myDataList = new ArrayList<>();
myDataList.add(new MyData(39.9139, 116.3917, "Marker 1", "Content 1"));
myDataList.add(new MyData(39.9145, 116.3921, "Marker 2", "Content 2"));
myDataList.add(new MyData(39.9132, 116.3932, "Marker 3", "Content 3"));
myDataList.add(new MyData(39.9125, 116.3918, "Marker 4", "Content 4"));
myDataList.add(new MyData(39.9128, 116.3929, "Marker 5", "Content 5"));
return myDataList;
}
private static class MyData {
private double latitude;
private double longitude;
private String title;
private String content;
public MyData(double latitude, double longitude, String title, String content) {
this.latitude = latitude;
this.longitude = longitude;
this.title = title;
this.content = content;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
}
``
原文地址: https://www.cveoy.top/t/topic/ht2m 著作权归作者所有。请勿转载和采集!