我正在使用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);
}
您可以在调用该方法之间给位置管理器最短的等待间隔,但它并不介意100%的时间间隔(请参阅LocationManager.requestLocationUpdates()的描述)。可能更短,也可能更长,因为,例如,天气可能多云,gps芯片无法像您希望的那样定期获得位置更新。
没有合适的方法来克服这一点——定位服务总是有缺陷的。我使用的每个位置感知应用程序都会不时地"挂"上标记,因为gps芯片有一段时间无法修复。
你能做的唯一一件事就是记住移动速度,如果gps失去定位,基于用户以与gps定位时相同的速度朝同一方向移动的假设,给地图标记虚假更新。但这样做只有在2-5次跳过的真实更新时才有意义(只是为了在修复丢失几秒钟时平滑这些情况)。
UPD为此,您可以实现一种代理位置侦听器,它将严格按照您指定的间隔(例如每200毫秒)更新标记,并根据其存储的位置进行更新。并且存储的位置可以由实际位置侦听器异步更新。定位对象有提供数据的修复时间(请参阅getTime()方法),您可以使用它来确定是否仍应"预测"下一个标记移动,或者该位置足够旧,可以放弃并通知用户gps不知道它们在哪里:)