Xamarin. Android Карты Google размыты при навигации - PullRequest
0 голосов
/ 27 мая 2020

Я создаю приложение для автомобильной навигации в 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 метр.

Я буду признателен за любые предложения по решению проблемы ...

введите описание изображения здесь введите описание изображения здесь

...