Android ItemizedOverlay似乎在用一个“;“破碎的”;预测

Android ItemizedOverlay似乎在用一个“;“破碎的”;预测,android,android-mapview,android-maps,itemizedoverlay,Android,Android Mapview,Android Maps,Itemizedoverlay,我有一个奇怪的问题,我真的不知道如何攻击,所以我想知道是否有人曾经有过类似的问题 我在ItemizeOverlay子类中重写了draw(Canvas Canvas、MapView MapView、boolean shadow)方法,以便在项目之间绘制一些路径、文本等。我在重写中做的第一件事是使用所有这些参数调用super.draw。当我启动应用程序时,我在覆盖中绘制的线是它们应该位于的位置,但super.draw绘制的实际覆盖项却相差很远。有趣的是,当我将地图移到左上角(坐标0,0)时,覆盖项越

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

我在ItemizeOverlay子类中重写了draw(Canvas Canvas、MapView MapView、boolean shadow)方法,以便在项目之间绘制一些路径、文本等。我在重写中做的第一件事是使用所有这些参数调用super.draw。当我启动应用程序时,我在覆盖中绘制的线是它们应该位于的位置,但super.draw绘制的实际覆盖项却相差很远。有趣的是,当我将地图移到左上角(坐标0,0)时,覆盖项越来越接近我期望的位置(事实上,当我将第一个项移到点(0,0)时,它们看起来非常匹配)。当我移动地图,使覆盖项远离(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为覆盖项绘制的阴影层实际上位于每个特定项的可绘制地理位置和预期地理位置之间

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

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

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

  • 是否使用地图视图的投影?是否确保每次调用draw()时都检索一个新的

  • 您确定为您的绘图设置了绑定方法吗?e、 例如,
    boundCenter()
    boundCenterBottom()


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

    问题在于我对可提款权提取的基本方式存在误解。这种误解源于阅读JavaDoc for Drawable.draw,其中说:

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

    由于我最初有一个覆盖子类绘制了屏幕截图上可以看到的路径,并决定对该路径上的标记使用ItemizedOverlay(以便它们易于点击等),因此我开始稍微修改我的类。在某一点上,为了查看事情是否按照我预期的方式进行,我添加了一些项,并使用了与其中一个路径端点相同的Drawable。在draw方法的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实际上定义了可绘制对象的边界(这是他们的JavaDoc所说的),但我想它只是改变了“最终”确定边界的方式,当您要绘制的实际点已知时


    在任何情况下,我添加了一些额外的功能来使用我实际上想要用于OverlayItems的drawables,果然,它工作得非常完美。我仍然想知道我在drawMarker中所做的是不是应该这样做,但我不知道还有什么其他方法可以告诉画布在哪里放置可绘制对象。

    1。是的,我调用mapView.getProjection()作为draw方法中的第一件事,并在draw方法期间使用返回的对象-但是,我甚至不认为在draw覆盖中不使用精确投影会导致此问题,因为super.draw调用的结果会给我带来意外的结果。2.是的,我对所有覆盖项使用相同的默认drawable,并通过super(boundCenterBottom(defaultMarker))在构造函数中设置它