Itemize Overlay似乎是用“破碎”投影绘制的

时间:2010-08-13 13:10:50

标签: android android-mapview android-maps itemizedoverlay

我有一个奇怪的问题,我真的不知道如何攻击所以我想知道是否有人之前有过类似的问题。

我在ItemizedOverlay子类中覆盖draw(Canvas canvas,MapView mapView,boolean shadow)方法,以在项之间绘制一些路径,文本等。我在覆盖中做的第一件事是使用所有这些参数调用super.draw。当我启动应用程序时,我在覆盖中绘制的线条应该是它们应该在的位置,但是super.draw绘制的实际OverlayItems是关闭的。有趣的是,当我将地图移向左上角(coords 0,0)时,OverlayItems越来越接近我期望它们的位置(实际上,当我得到第一个时它们似乎完全匹配item to point(0,0))。当我移动地图以使OverlayItem从(0,0)点进一步延伸时,它们线性地从它们的地理位置进一步延伸。

如果之前没有人遇到过这个问题并且它不是明显的问题,我会尝试制作一个仍然存在此行为的最小示例并将其发布到此处。实际代码相对较大,所以如果有人知道可能存在什么问题,我想避免那么多工作。

编辑:可能有用的另外一条信息...我的绘制方法如下所示:

public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    super.draw(canvas, mapView, shadow);
    if (!shadow) {
        // code for drawing the lines etc.
        // on the canvas (uses mapView.getProjection()) 
    }
}

叠加层的自定义部分没有阴影层(我在扩展叠加时使用了相同的逻辑而没有任何问题)。由super.draw为OverlayItems绘制的阴影层实际上位于Drawable和每个特定项目的预期地理位置之间。

以下是来自avd的树截图,以更好地说明正在发生的事情。当我将地图向左上方滑动时,四个红色引脚应位于它们上方的红线上并实际朝向该线移动。两个引脚和它们之间的线在我的自定义覆盖中绘制,super.draw绘制四个阴影和四个额外的红色引脚。

由于这是我的第一篇帖子而且我不能发布多个链接,我将所有三个屏幕截图放在同一个jpg上。
screenshot

2 个答案:

答案 0 :(得分:0)

如果不查看代码,很难诊断出来。不过我会检查一些事情:

  1. 您使用的是MapView的投影吗?每次调用draw()时都要确保检索一个新的吗?

  2. 您是否确定了Drawables的绑定方法?例如,boundCenter()boundCenterBottom()

答案 1 :(得分:0)

我已经解决了这个问题,我猜我得到的洞察力可能对其他人有用,所以我会解释这里发生的事情。我不确定回答我自己的问题是否合适 - 如果没有,请告诉我应该把这个文本放在哪里,我会相应地编辑/删除。

问题在于我对Drawables绘制的基本方式的误解。这种误解是通过阅读JavaDoc for Drawable.draw得出的:

  

绘制边界(通过setBounds设置)   尊重可选效果,如   alpha(通过setAlpha设置)和颜色   filter(通过setColorFilter设置)。

因为我最初有一个Overlay子类绘制了你可以在屏幕截图上看到的路径,并决定使用ItemizedOverlay作为沿着该路径的标记(以便它们易于点击等)。我开始略微改变我的类。在某个时刻,为了看看事情是否按照我预期的方式工作,我添加了一些项目,并使用与其中一个路径端点相同的Drawable。在JavaDoc的指导下,我使用了类似的东西来绘制路径端点

private void drawMarker(Canvas canvas, Projection projection,
    GeoPoint location, Drawable drawable) {
    Point point = projection.toPixels(location, null);
    drawable.setBounds(
        point.x,
        point.y - drawable.getIntrinsicHeight(),
        point.x + drawable.getIntrinsicWidth(),
        point.y);
    drawable.draw(canvas);
}  

然而,当我追踪super.draw调用时,我注意到它最终调用了Drawable.draw但是drawable总是有相同的边界 - 我之前调用这个drawMarker方法设置的边界。我仍然不太明白Drawable.draw如何知道实际放置Drawable的位置,但当然,我在问题中描述的行为非常明显。事后看来,我可能应该已经意识到boundCenter和boundCenterBottom实际上定义了Drawable的边界(这是他们的JavaDoc所说的),但我想我认为它只是改变了“最终”确定边界的方式,当时你想要绘制的实际点是已知的。

在任何情况下,我都添加了一些额外的功能来使用我实际想用于OverlayItems的drawables,果然,它完美无缺。我仍然想知道我在drawMarker中所做的事情是否应该完成,但我不知道有什么其他方法可以告诉画布将Drawable放在哪里。