Android Osmdroid自定义标记可抽件罐';不要绘制文本或形状
我目前正在使用最新的Android Osmdroid自定义标记可抽件罐';不要绘制文本或形状,android,drawing,osmdroid,Android,Drawing,Osmdroid,我目前正在使用最新的osmdroid库(3.0.10)在带有ItemizedOverlay的地图上显示我的自定义标记。我已经扩展了Drawable类来实现我自己的绘图。但是,我的可绘制内容绘制不正确。我画了一个位图图像,一个圆圈和一个文本在彼此的上面。位图已绘制,但圆圈和文本不可见。当我在图像视图中使用相同的绘图工具时,一切正常 以下是我的drawable的onDraw方法的代码: @Override public void draw(Canvas canvas) { canvas.sa
osmdroid
库(3.0.10)在带有ItemizedOverlay
的地图上显示我的自定义标记。我已经扩展了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();
}
我尝试在位图上绘制圆圈和文本,并在提供的画布上绘制。这是可行的,但这扼杀了整个重点
感谢您的帮助 在浏览了一天osmdroid源代码之后,我设法解决了我的问题,但还没有发现它们为什么会出现在那里。Osmdroid使用ISafeCanvas接口(和SafeTranslatedCanvas实现)包装画布,以处理一些高缩放级别的转换故障。虽然我在代码中没有发现任何直接的错误,但在绘制覆盖图时,我绕过了机制,重写了ItemizeOverlay的draw方法,并创建了自己的ISafeCanvas实现,它只在getSafeCanvas方法中返回封装的画布,现在一切看起来都很好
@Override
protected void draw(Canvas canvas, MapView mv, boolean shadow) {
drawSafe(new MyCanvas(canvas),mv,shadow);
}
这远不是最好的解决方案,SafeCanvas的存在是有原因的,所以我建议使用这种方法进行彻底的测试
注意:我只使用了Android 4.1.1,不知道其他设备上是否存在此问题。请查看。基本上,您希望使用:
canvas.getUnsafeCanvas(new UnsafeCanvasHandler() {
// Draw circle and text here
// (but not drawBitmap)
});
密切关注问题,寻找更持久的解决方案