Android中OSMdroid自定义Marker图标显示于路线上方的问题求助
解决OSMdroid自定义Marker图标显示位置异常(覆盖路线)的问题
看起来你遇到的问题是自定义Marker图标显示层级或位置不对,默认图标正常但自定义图画出问题,试试下面这几个方案:
方案1:给自定义Drawable设置正确的边界
这大概率是核心问题——你缩放后的BitmapDrawable没有设置边界,导致OSMdroid无法正确计算锚点的位置,进而出现显示偏移。修改你的代码,在设置图标前加上边界设置:
Drawable d = ResourcesCompat.getDrawable(getResources(), R.drawable.bus, null); Bitmap bitmap = ((BitmapDrawable) d).getBitmap(); int targetSize = (int) (48.0f * getResources().getDisplayMetrics().density); Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, targetSize, targetSize, true); BitmapDrawable dr = new BitmapDrawable(getResources(), scaledBitmap); // 关键:设置Drawable的边界,让OSMdroid知道图标的实际尺寸 dr.setBounds(0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight()); marker.setIcon(dr);
默认图标之所以正常,是因为OSMdroid内置的Marker图标已经预先处理好了边界信息,自定义Drawable需要手动补上这一步。
方案2:调整Overlay的添加顺序
OSMdroid的Overlay是按添加顺序绘制的:先添加的Overlay会被画在底层,后添加的在顶层。如果你的路线Overlay是在Marker之后添加的,路线就会覆盖Marker;反之Marker会在路线上方。
如果你希望Marker在路线上方,确保先添加路线Overlay,再添加Marker:
// 先添加路线 mapView.getOverlays().add(yourRouteOverlay); // 再添加Marker,确保它在顶层 mapView.getOverlays().add(marker);
方案3:给Marker设置Z-index(OSMdroid 6.x支持)
如果调整添加顺序还是不行,可以直接给Marker设置更高的Z-index值,强制让它显示在其他Overlay之上:
marker.setZIndex(10); // 数值比路线Overlay的Z-index高即可,默认Overlay的Z-index是0
额外调试建议
- 可以打印Drawable的边界信息,确认尺寸是否正确:
Log.d("MarkerDrawable", "Bounds: " + dr.getBounds().toString()); - 也可以尝试用
BitmapFactory直接加载图片,可能比转换Drawable更稳定:Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.bus); int targetSize = (int) (48.0f * getResources().getDisplayMetrics().density); Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, targetSize, targetSize, true); BitmapDrawable dr = new BitmapDrawable(getResources(), scaledBitmap); dr.setBounds(0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight()); marker.setIcon(dr);
内容的提问来源于stack exchange,提问作者Haniku
相关产品推荐
相关产品推荐

