【问题标题】:How can I smoothly pan a GoogleMap in Android?如何在 Android 中顺利平移 GoogleMap?
【发布时间】:2015-11-20 22:29:39
【问题描述】:

我有一个对象以每秒 1 到 10 个的速率传输位置。我希望我的 GoogleMap(Android,v2)能够连续平稳地平移以使对象保持在地图中心附近。我该怎么做?

简单的方法是在收到每个新位置时调用 GoogleMap.moveCamera。但是,这会导致显示不稳定;地图会跳到每个新位置,而不是平滑地平移到它。

更好的方法是调用 GoogleMap.animateCamera - 将相机平稳地平移到新位置。但是,当新位置的到达速度快于动画完成的速度时,每个 animateCamera 调用都会取消先前的动画并启动一个新动画。所有动画都开始缓慢,然后加速,然后快速减速。这意味着不断启动新动画意味着相机总是非常缓慢地平移并且无法跟上实际位置。

解决此问题的方法是在动画正在进行时将传入位置排队,然后在前一个动画完成后立即将动画启动到最近的位置。这比以前的两种方法都好,但它仍然会停止并开始,因为每个动画都在完全停止时开始和结束。

似乎实现所需效果的唯一可能方法是编写我自己的动画器,它以高帧速率调用 moveCamera 并在移动时处理加速、减速和新位置。这种方法的问题是我不知道如何限制我的 moveCamera 更新,因为我不知道 GoogleMap 的更新帧率,而且似乎没有任何 setFrameRenderedListener 方法(或类似方法)。

对如何实现这个效果有什么建议吗?

【问题讨论】:

  • 附带问题,如果您获得了如此多的位置,以至于每个位置都需要您自己的动画师(或连续平移),那么从用户体验的角度来看,这如何工作,就好像您移动该领域的速度比用户可以摄取信息(或晕车)?
  • 连续平移并不意味着快速平移。谷歌地图的导航就是一个平滑连续平移的应用示例。

标签: android google-maps user-interface android-animation smooth-scrolling


【解决方案1】:

如果我对您的理解正确,您设想让传入的位置更新为地图设置动画,以将设备位置(或其他东西)保持在地图的中心。

您提到的谷歌导航似乎执行了一些死角侦察,这意味着即使位置更新之间有 10 秒的间隔,该位置也不会从一个点跳到另一个点,而是在某个点平稳移动以一定的速度前进。

位置更新中提供了航向(方位)和速度(如果由 GPS 提供)。

在我看来,类似的事情可能是解决您问题的一种方法。当然,您仍然必须确定您对每次位置更新的信任程度,因为异常值会使其在可能不正确的方向上“快速前进”。将准确性考虑在内并丢弃那些包含太多不确定性的内容可能就足够了。

最终,您应该能够执行将一个或多个先前更新考虑在内的连续相机动画,从而使您能够每 x 秒触发一次 animateCamera,而不是等待位置更新。

希望你能明白这个想法,尽管它有点模糊,但对你有帮助。

【讨论】:

  • 我认为我的问题实际上更简单。假设我希望地图沿着已知的圆形路径平滑平移;我怎么做?重复的 animateCamera 调用将导致问题中所述的停止和启动。
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2015-10-10
  • 2012-10-26
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多