You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:02:43