【问题标题】:OnCameraChange not returning expected valueOnCameraChange 未返回预期值
【发布时间】:2013-05-07 18:07:59
【问题描述】:

首先让我声明这个问题与我的原生 Android 应用程序的 Map v2 API 有关。其次,我查看了一些关于如何检测 Map v2 API 上的平移更改的 stackOverflow 帖子(例如,How to handle onTouch event for map in Google Map API v2?),但在这一点上,鉴于我的要求,这些解决方案似乎有点矫枉过正。

这就是我想要完成的事情......

检测用户是否更改了地图的原始相机位置(缩放或平移),如果是,则在地图上显示重置按钮,以便用户可以通过点击重置按钮将地图重置为原始位置。

这是我的方法.....

为此,我使用“OnCameraChangeListener getCameraChangeListener()”回调和回调测试传入的相机位置(通过 onCameraChange(CameraPosition 位置)是否不同于渲染地图的“原始”相机位置。如果它是不同的,然后我显示重置按钮,以便用户可以将地图返回到它的位置。

这是我遇到的问题....

一切都按预期工作,除了当调用“OnCameraChange”回调以响应将地图图像重置为其“原始”位置(通过“重置”按钮)时,相机“位置”通过“onCameraChange”传入即使地图已正确重置,回调也不匹配“原始”地图位置(正如我所料)。

这给我带来了一个问题,因为如果通过回调传入的相机位置与“原始”位置不匹配,那么我会使重置按钮可见。但是因为我已经成功地将地图重置到它的原始位置,所以我不再希望重置按钮可见......因此我的问题。

这是我需要你帮助的地方......

  • 我在这里缺少什么?如上所述,我预计最后一次回调中返回的地图“位置”(通过 onCameraChange)将与“原始”相机位置相匹配......毕竟重置为“原始”地图位置是触发的最后一次 onCameraChange 回调。

问候。

【问题讨论】:

    标签: android maps android-maps-v2


    【解决方案1】:

    我刚刚对此进行了测试,并在gmaps-api-issues 上进行了报告。

    现在您必须编写自己的equals(CameraPosition, CameraPosition),它会考虑到目标LatLng 的差异非常小。

    我的测试表明:

    CameraPosition{target=lat/lng: (0.2345,12.98231), zoom=5.4231, tilt=13.33, bearing=40.0}
    CameraPosition{target=lat/lng: (0.23449985034422136,12.982310056686401), zoom=5.4231, tilt=13.33, bearing=40.0}
    

    【讨论】:

    • 谢谢...至少现在我知道这是一个缺陷。我正在拔头发,试图弄清楚为什么它不起作用。我为这个问题“加注了星标”。希望他们能尽快修复它。
    • 我不希望它很快修复非常。使用您自己的equals 实施解决方法应该不会超过几分钟。等待可能需要 1 到 3 个月;)
    • 是的,我想我可以实现上面描述的 equals 方法。我首先需要确定 onCameraChange 位置与实际地图位置的距离……如果距离不太远,那么您的建议似乎是合理的……但是,如果返回的位置偏离了“很多”,那么做什么你建议不会有帮助。只是好奇你有没有做过任何计算来确定它有多远?几英尺? 10英尺?几百英尺?等
    • 我的答案中的测试表明它小于 0.0000002。假设Math.abs(...) < 0.00001 你是安全的。
    • 顺便说一句,我的测试表明 onCamera 更改返回的位置稍微偏离了一点。在我非常简短的测试中,相机位置在给定的缩放级别下最多关闭(增量距离)~.00004 码。该增量距离可能因缩放级别而异。虽然如果您正在玩马蹄铁或手榴弹,这个 delta 距离可能已经足够了,但它仍然不正确,并迫使开发人员制定解决方法。
    【解决方案2】:

    看起来精度丢失了,因为 GMaps 在传递给 onCameraChange 之前将 LatLng 值从 Double 转换为浮点数

    这适用于我的情况:

                public boolean equals(LatLng original, LatLng target) {
                    return ((float) original.latitude == (float) target.latitude 
                        || (float) original.longitude == (float) target.longitude);
                }
    

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2016-02-13
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2012-11-08
      • 2020-07-06
      相关资源
      最近更新 更多