android osmdroid 批量添加多种标记和弹窗样式不同不同的标记放入相同的图层进行管理给出详细代码并优化
以下是一个示例代码,使用osmdroid库批量添加多种标记和弹窗,样式不同,不同的标记放入相同的图层进行管理:
// 创建标记图层
ItemizedIconOverlay<OverlayItem> markerOverlay = new ItemizedIconOverlay<OverlayItem>(new ArrayList<OverlayItem>(), null, new DefaultResourceProxyImpl(context));
// 创建弹窗图层
ItemizedOverlayWithFocus<OverlayItem> popupOverlay = new ItemizedOverlayWithFocus<OverlayItem>(new ArrayList<OverlayItem>(), null, new DefaultResourceProxyImpl(context));
// 创建标记和弹窗
OverlayItem marker1 = new OverlayItem("Title 1", "Description 1", new GeoPoint(0, 0));
marker1.setMarker(context.getResources().getDrawable(R.drawable.marker1));
markerOverlay.addItem(marker1);
OverlayItem popup1 = new OverlayItem("Title 1", "Description 1", new GeoPoint(0, 0));
popup1.setMarker(context.getResources().getDrawable(R.drawable.popup1));
popupOverlay.addItem(popup1);
OverlayItem marker2 = new OverlayItem("Title 2", "Description 2", new GeoPoint(0, 0));
marker2.setMarker(context.getResources().getDrawable(R.drawable.marker2));
markerOverlay.addItem(marker2);
OverlayItem popup2 = new OverlayItem("Title 2", "Description 2", new GeoPoint(0, 0));
popup2.setMarker(context.getResources().getDrawable(R.drawable.popup2));
popupOverlay.addItem(popup2);
// 将标记和弹窗图层添加到地图中
map.getOverlays().add(markerOverlay);
map.getOverlays().add(popupOverlay);
// 注册弹窗点击事件
popupOverlay.setOnFocusChangeListener(new ItemizedOverlayWithFocus.OnFocusChangeListener<OverlayItem>() {
@Override
public void onFocusChanged(ItemizedOverlayWithFocus<OverlayItem> overlay, OverlayItem newFocus) {
// 显示弹窗
if (newFocus != null) {
// 创建弹窗布局
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_layout, null);
// 设置弹窗内容
TextView titleText = (TextView) popupView.findViewById(R.id.popup_title);
TextView descText = (TextView) popupView.findViewById(R.id.popup_description);
titleText.setText(newFocus.getTitle());
descText.setText(newFocus.getSnippet());
// 显示弹窗
PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
popupWindow.showAtLocation(map, Gravity.CENTER, 0, 0);
}
}
});
// 优化:使用缓存的标记和弹窗
// 在创建标记和弹窗时,可以将它们添加到缓存中
Map<String, Drawable> markerCache = new HashMap<String, Drawable>();
Map<String, View> popupCache = new HashMap<String, View>();
OverlayItem marker1 = new OverlayItem("Title 1", "Description 1", new GeoPoint(0, 0));
if (markerCache.containsKey("marker1")) {
marker1.setMarker(markerCache.get("marker1"));
} else {
Drawable markerDrawable = context.getResources().getDrawable(R.drawable.marker1);
marker1.setMarker(markerDrawable);
markerCache.put("marker1", markerDrawable);
}
markerOverlay.addItem(marker1);
OverlayItem popup1 = new OverlayItem("Title 1", "Description 1", new GeoPoint(0, 0));
if (popupCache.containsKey("popup1")) {
popup1.setMarker(popupCache.get("popup1"));
} else {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_layout, null);
// 设置弹窗内容
TextView titleText = (TextView) popupView.findViewById(R.id.popup_title);
TextView descText = (TextView) popupView.findViewById(R.id.popup_description);
titleText.setText("Title 1");
descText.setText("Description 1");
popupView.setBackgroundResource(R.drawable.popup1);
popup1.setMarker(new BitmapDrawable(getResources(), createBitmapFromView(popupView)));
popupCache.put("popup1", popup1.getMarker());
}
popupOverlay.addItem(popup1);
// 可以自定义一个方法,将View转换为Bitmap
private Bitmap createBitmapFromView(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
``
原文地址: https://www.cveoy.top/t/topic/huqQ 著作权归作者所有。请勿转载和采集!