1

我有一个奇怪的问题,我真的不知道如何解决,所以我想知道以前是否有人遇到过类似的问题。

我覆盖 ItemizedOverlay 子类中的 draw(Canvas canvas, MapView mapView, boolean shadow) 方法以在项目之间绘制一些路径、文本等。我在覆盖中做的第一件事是使用所有这些参数调用 super.draw。当我启动应用程序时,我在覆盖中绘制的线条是它们应该在的位置,但是 super.draw 绘制的实际 OverlayItems 是很远的。有趣的是,当我将地图移向左上角(坐标 0,0)时,OverlayItems 越来越接近我期望它们所在的位置(事实上,当我得到第一个时,它们似乎完美匹配项目到点 (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 上。
截屏

4

2 回答 2

0

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

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

  2. 你确定你的 Drawable 有一个绑定方法吗?例如,boundCenter()boundCenterBottom()

于 2010-08-13T13:19:01.567 回答
0

我已经解决了这个问题,我想我得到的见解可能对其他人有用,所以我将解释这里发生了什么。我不确定是否适合回答我自己的问题 - 如果不适合,请指示我应该将这段文字放在哪里,我将相应地编辑/删除。

问题在于我对 Drawable 绘制的基本方式的误解。这种误解来自于阅读 Drawable.draw 的 JavaDoc,它说:

在其边界内绘制(通过 setBounds 设置)尊重可选效果,例如 alpha(通过 setAlpha 设置)和颜色过滤器(通过 setColorFilter 设置)。

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

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 的可绘制对象,果然,它完美地工作。我仍然想知道我在 drawMarker 中所做的是否是它应该完成的方式,但我不知道有任何其他方式告诉画布将 Drawable 放在哪里。

于 2010-08-15T14:09:09.140 回答