Я создаю приложение для автомобильной навигации в Xamarin. Android (собственные, а не формы). Я много читал и следую инструкциям, которые я нашел, о том, как добавить карту в приложение, а также о том, как использовать службы определения местоположения, либо с FusedLocationProvider, либо с NavigationManager. Я решил использовать NavigationManager, поскольку он выглядит более точным из-за количества десятичных цифр (14) в LatLng. Все хорошо до сих пор. Я тестирую свое приложение, и пока маркер и карта движутся, чтобы следить за направлением автомобиля, карта размыта (см. Прикрепленные изображения), похоже, у нее нет подходящего времени для обновления.
Что я делаю, чтобы переместить камеру и маркер? 1. OnLocationChanged из LocationManager Я вызываю функцию UpdateCameraBearing
internal static void UpdateCameraBearing(float bearing, Location newLocation)
{
if (Map == null)
return;
// Save current zoom
int originalZoom = (int)Map.CameraPosition.Zoom;
if (!startingZoom.HasValue)
{
startingZoom = originalZoom = MapZoomDef;
}
LastLocation = newLocation;
LatLng newPosition = new LatLng(newLocation.Latitude, newLocation.Longitude);
CameraPosition camPos = new CameraPosition(newPosition, originalZoom != MapZoomDef ? originalZoom : MapZoomDef, 0, bearing);
try
{
Map.AnimateCamera(CameraUpdateFactory.NewCameraPosition(camPos));
UpdateMarkerPosition(newPosition);
}
catch (Exception ex)
{
Log.Error(TAG, ex.Message);
}
}
Эта функция анимирует камеру в новое положение, а также обновляет положение маркера с помощью функции UpdateMarkerPosition следующим образом:
private static void UpdateMarkerPosition(LatLng newPosition)
{
if (null == MapMarker)
{
SetNewMarker(newPosition);
}
else
{
//positionMarker.Visible = true;
//positionMarker.Position = newPosition;
AnimateMarker(newPosition, new LatLngInterpolatorSpherical());
}
}
private static void SetNewMarker(LatLng myPosition)
{
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.SetPosition(myPosition);
markerOptions.SetIcon(BitmapDescriptorFactory.FromResource(Resource.Mipmap.ic_car));
MapMarker = Map.AddMarker(markerOptions);
}
private static void AnimateMarker(LatLng finalPosition, LatLngInterpolatorSpherical latLngInterpolator)
{
Android.OS.Handler handler = new Android.OS.Handler();
long start = Android.OS.SystemClock.UptimeMillis();
LatLng startPosition = MapMarker.Position;
Android.Views.Animations.AccelerateDecelerateInterpolator interpolator = new Android.Views.Animations.AccelerateDecelerateInterpolator();
float durationInMs = 1000;
Java.Lang.Runnable mUpdateGeneration = null;
mUpdateGeneration = new Java.Lang.Runnable(() => {
long elapsed;
float t;
float v;
// Calculate progress using interpolator
elapsed = Android.OS.SystemClock.UptimeMillis() - start;
t = elapsed / durationInMs;
v = interpolator.GetInterpolation(t);
MapMarker.Position = latLngInterpolator.Interpolate(v, startPosition, finalPosition);
// Repeat till progress is complete.
if (t < 1)
{
// Post again 16ms later.
handler.PostDelayed(mUpdateGeneration, 16);
}
});
handler.Post(mUpdateGeneration);
}
Функция UpdateMarkerPosition проверяет, существует ли маркер, и если нет (это первый раз), она создает его, в противном случае она вызывает функцию AnimateMarker, где я использую Interpolator для имитации плавного движения маркера.
И последнее, но не менее важное: LocationManager.RequestLocationUpdates настроен на минимальное время в 1 секунду и минимальное расстояние в 1 метр.
Я буду признателен за любые предложения по решению проблемы ...
введите описание изображения здесь введите описание изображения здесь