我有一个对象以每秒 1 到 10 个之间的速率流式传输位置。我想让我的 GoogleMap(Android,v2)连续平稳地平移以使对象保持在 map 中心附近。我该怎么做?
天真的方法是在收到每个新位置后简单地调用 GoogleMap.moveCamera。但是,这会导致显示不稳定; map 会跳到每个新位置,而不是平滑地平移到它。
更好的方法是调用 GoogleMap.animateCamera,它可以平滑地将相机平移到新位置。但是,当新 Locations 到达的速度快于动画完成的速度时,每个 animateCamera 调用都会取消之前的动画并启动一个新的动画。所有动画开始时都很慢,然后加速,然后迅速减速。这意味着连续启动新动画意味着相机总是平移得非常慢,无法跟上实际位置。
解决此问题的方法是在动画进行时将传入位置排队,然后在上一个动画完成后立即启动到最近位置的动画。这比以前的两种方法都要好,但它仍然会停止和开始,因为每个动画都是在完全停止时开始和结束的。
似乎实现预期效果的唯一可能方法是编写我自己的动画师,它以高帧率调用 moveCamera 并在移动时处理加速、减速和新位置。这种方法的问题是我不知道如何限制我的 moveCamera 更新,因为我不知道 GoogleMap 的更新帧率并且似乎没有任何 setFrameRenderedListener 方法(或类似方法)。
关于如何实现这种效果有什么建议吗?
最佳答案
如果我对您的理解正确,您设想让传入的位置更新为 map 设置动画,以将设备位置(或其他位置)保持在 map 的中心。
您提到的 Google 导航似乎执行了一些航向侦察,这意味着即使在位置更新之间有 10 秒的时间,位置也不会从一个点跳到另一个点,而是在某个特定的范围内平稳移动以一定的速度前进。
位置更新中提供航向(方位)和速度(如果由 GPS 提供)。
在我看来,类似的东西可能是解决您问题的一种方法。当然,您仍然必须确定您对每个位置更新的信任程度,因为异常值会使它“快速前进”到一个可能不正确的方向。考虑到准确性并丢弃那些包含太多不确定性的因素可能就足够了。
最终,您应该能够执行考虑到一个或多个先前更新的连续相机动画,使您能够每 x 秒触发一次 animateCamera,而不是等待位置更新。
希望你明白这个想法,尽管它有点模糊,但它对你有帮助。
关于android - 如何在 Android 中顺利平移 GoogleMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33837133/