【问题标题】:How do you control the order of OverlayItems on an ItemizedOverlay?如何控制 ItemizedOverlay 上 OverlayItems 的顺序?
【发布时间】:2012-12-14 21:44:05
【问题描述】:

首先我在这里继承了很多代码,虽然我已经梳理了几次寻找这种行为的原因,但我很难过。

我希望最后点击的OverlayItem 位于其余部分之上,即使它看起来很傻。我所看到的是,当MapView 正在制作动画时(以OverlayItem 为中心),它完全按照我的意愿行事,然后当它完成时,“选定的”再次跳到背景。

这是默认行为吗?或者我的代码中有什么东西把这一切都搞砸了?

制作动画时:

居中动画完成后:

我可以看到一些解决此问题的方法(在draw() 方法中自己绘制选定的OverlayItem 或确保选定的是最后绘制的),但是人们在这种情况下会做什么?或者这只是我需要撤消的代码深处的一个错误?

【问题讨论】:

  • 我没有玩过重叠标记。当您从ItemizedOverlay 提供它们时,绘图顺序是否似乎与基于索引的标记顺序一致?
  • 不,我应该提到这是我的第一次尝试。他们似乎总是从北向南绘制,以保持 3D 外观......
  • 我想我应该搜索得更好一点:stackoverflow.com/questions/11182343/…
  • 你好 xbakesx,我需要像你一样使用 mapforge 和 osmdroid 在地图上添加自定义信息窗口,你能帮我如何自定义信息窗口。谢谢
  • @nitesh 我对这两个方面都没有任何经验,但是如果你想写一个关于你到目前为止所拥有的问题,你正在尝试做什么以及你已经完成了什么试过了,好像不行,我一定要看看!

标签: android android-mapview itemizedoverlay overlayitem


【解决方案1】:

我相信,当您将注意力集中在特定的OverlayItem 上时,它就会出现在前面。比如:

    myItemizedOverlay.setFocus(overlayItem);

有了这个,你就不需要一直玩物品顺序了。

--已编辑--

//Define this class level field
private Handler mHandler = new Handler();

//Use this after starting animation
mHandler.postDelayed(new Runnable() {

    @Override
    public void run() {
        myItemizedOverlay.setFocus(overlayItem);
        mapView.invalidate();  
    }
}, 500);

问候。

【讨论】:

  • 这将是解决问题的一个更优雅的解决方案,但它似乎并没有强制将传入的项目放在顶部。文档没有说有,但也没有说没有……developers.google.com/maps/documentation/android/v1/reference/…
  • 我知道文档不会引用它,因为我在发布之前已经检查过了。但是,我已经在一个应用程序中使用了它,并且确实如此:-)。我认为您还需要在设置焦点后致电mapView.invalidate()
  • 还有一件事...我使用了StateListDrawable,但不相信它有什么不同。 setFocus 只是复制点击标记的行为,将其带到前面。
  • 我不认为drawable有什么不同。如果我mapView.invalidate(),如果我等到地图将标记动画到中心之后,然后再次长按标记,它有时会弹出到前面。动画确实似乎从项目中移除了焦点,不知道为什么它有时似乎只停留在前景中......想法?
  • 让标记在动画序列中失去焦点看起来是合理的,否则焦点可能会停留在标记上,这将超出可见屏幕(实际上将是一个不存在的标记)。 ..您是否尝试在启动动画后设置焦点?如果这不能解决问题,您可以尝试在启动动画后延迟几秒钟发布setFocous()。这并不完美,但应该可以解决问题。
【解决方案2】:

编辑: 似乎 ItemizedOverlay.setFocus(item) 是在顶部绘制单个项目的方法(在 mapview.invalidate() 之后)。我无法让它按照我想要的方式工作,因为当mapview 动画时,它会移除焦点并且绘图顺序会变回来。

非常感谢 Android Mapview: Control ordering of multiple types of OverlayItems? 向我指出绘图顺序行为。

目前,这是我的强硬解决方案。您可以通过在ItemizedOverlay 中覆盖getIndexToDraw 来完全控制OverlayItems 的显示顺序。

protected int getIndexToDraw(final int drawingOrder)

drawingOrder 参数与传入createItem 的参数具有相同的索引。您返回绘制标记的顺序(稍后绘制较大的数字,这意味着“在顶部”)。

在我的特定情况下,我有一个 ArrayList 的项目,我排序并确保选定的 OverlayItem 始终在列表中的最后一个。那么我的getIndexToDraw 方法如下所示:

@Override
protected int getIndexToDraw(final int drawingOrder)
{
    return drawingOrder;
}

为了绘制OverlayItems 的顺序与我将它们存储在我的ArrayList 中的顺序相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2010-11-05
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多