4

我正在使用 MyLocationOverlay 来显示当前位置。但是,更新位置需要一段时间。我想在 iPhone 上实现类似“跟随我”的功能,其中用户的位置也会随着用户的移动而移动。如何使 MyLocationOverlay 的标记对其位置执行实时更新?

请注意,我重写了 draw() 和 drawMyLocation() 因为我需要绘制一个自定义标记。

我当前的代码如下所示:(我的代码的问题是标记不会随着用户移动。由于调用 onLocationChanged 需要一段时间,所以标记会突然从一个地方跳到另一个地方。)

@Override
public synchronized void onLocationChanged(Location location)
{
    if (location != null && mapController != null)
    {
        //Recenter map based on current location
        mapController.animateTo(new GeoPoint((int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6)));
    }
    super.onLocationChanged(location);
}
4

1 回答 1

2

您可以在调用该方法之间为位置管理器提供最小的等待间隔,但它不会在 100% 的时间里完全介意该间隔(参见LocationManager.requestLocationUpdates()的描述)。可能更短,也可能更长 - 因为,例如,它可能是多云的,gps 芯片将无法像您希望的那样定期获取位置更新。

没有适当的方法来克服这一点——定位服务总是有缺陷的。我使用的每个位置感知应用程序都会不时“挂起”标记,因为 gps 芯片会暂时丢失修复。

您唯一可以做的就是记住移动速度,如果 gps 丢失修复,则基于用户以与 gps 时相同的速度沿相同方向移动的假设,给地图标记虚假更新有一个修复。但只有对 2-5 次跳过的实际更新才有意义(只是为了平滑修复丢失几秒钟的情况)。

UPD为此,您可以实现一种代理位置侦听器,它将严格按照您指定的时间间隔(例如每 200 毫秒)更新您的标记,并根据其存储的位置执行此操作。并且存储的位置可以由真实位置监听器异步更新。位置对象具有提供数据的修复时间(请参阅getTime()方法),您可以使用它来确定您是否仍应“预测”下一个标记移动,或者该位置足够老以放弃并通知用户 gps 没有线索他们在哪里:)

于 2012-02-07T16:15:58.987 回答