Osmdroid自定义标记drawables无法绘制文本或形状

时间:2013-06-01 14:34:02

标签: android drawing osmdroid

我目前正在使用最新的osmdroid库(3.0.10)在带有ItemizedOverlay的地图上显示自定义标记。我已经扩展了Drawable类来实现我自己的绘图。但是我的drawables未正确绘制。我将位图图像,圆圈和文本绘制在一起。绘制位图,但圆圈和文本不可见。当我在imageview中使用相同的drawable时,一切正常。

这是我的drawable的onDraw方法的代码:

@Override
public void draw(Canvas canvas) {
    canvas.save();
    canvas.translate(getBounds().left, getBounds().top);
    //this draws fine
    canvas.drawBitmap(bitmap, new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), new Rect(0,0,mWidth,mWidth), mPaint);
    //this is not
    canvas.drawCircle(mHeight/2, mHeight/2, mHeight/2, mPaint);
    //neither
    canvas.drawText("X", mHeight/2, mHeight/2, mPaint2);
    canvas.restore();
}

我尝试在位图上绘制圆圈和文本,然后在提供的画布上绘制它。它的工作正在发挥作用,但却终结了整个问题。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

经过一天的osmdroid消息来源后,我设法解决了我的问题,但没有找到他们为什么在那里。 Osmdroid使用ISafeCanvas接口(和SafeTranslatedCanvas实现)来包装画布来处理一些高缩放级别的转换故障。虽然我没有在代码中发现任何直接的错误,但是在通过覆盖ItemizedOverlay的draw方法并制作我自己的ISafeCanvas实现来绘制覆盖时绕过了机制,它只返回封装的canvas中的getSafeCanvas方法,现在一切看起来都很好

@Override
protected void draw(Canvas canvas, MapView mv, boolean shadow) {
    drawSafe(new MyCanvas(canvas),mv,shadow);
}

这远非一个最好的解决方案,SafeCanvas是有原因的,所以如果使用这种方法,我建议进行彻底的测试。

注意:我只使用Android 4.1.1,并且不知道其他设备上是否存在此问题。

答案 1 :(得分:0)

请查看Issue 427。基本上你想要使用:

canvas.getUnsafeCanvas(new UnsafeCanvasHandler() {
                             // Draw circle and text here
                             // (but not drawBitmap)
            });

密切关注更持久的解决方案。