Xamarin Android - пользовательский асинхронный режим изображения карты - PullRequest
0 голосов
/ 06 августа 2020

Я следую этому примеру: CustomMap

В этом примере изображение информируется напрямую ( Здесь ):

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:src="@drawable/xamarin" />

Я изменил его на:

<ImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center"
    android:id="@+id/InfoWindowFoto"/>

и:

var infoFoto = view.FindViewById<ImageView>(Resource.Id.InfoWindowFoto);              
if (infoFoto != null) GetImageBitmapFromUrl(infoFoto, customPin.local.Url_Imagem);

и:

private void GetImageBitmapFromUrl(ImageView img, string url)
    {
        using (var webClient = new WebClient())
        {
            var imageBytes = webClient.DownloadData(url);
            if (imageBytes != null && imageBytes.Length > 0)
            {
                var bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
                img.SetImageBitmap(bitmap);
            }
        }
    }

если изображение синхронное, работает с задержкой: (

Если я перейду на асинхронный, изображение не будет отображаться:

var infoFoto = view.FindViewById<ImageView>(Resource.Id.InfoWindowFoto);              
if (infoFoto != null) GetImageBitmapFromUrl(infoFoto, customPin.local.Url_Imagem);

private async void GetImageBitmapFromUrl(ImageView img, string url)
    {
        using (var webClient = new WebClient())
        {
            var imageBytes = await webClient.DownloadDataTaskAsync(url);
            if (imageBytes != null && imageBytes.Length > 0)
            {
                var bitmap = await BitmapFactory.DecodeByteArrayAsync(imageBytes, 0, imageBytes.Length);
                img.SetImageBitmap(bitmap);
            }
        }
    }

Я не знаю, как обновить представление, чтобы отображать изображение после его загрузки. Я также пробовал Picasso с тем же результат:

var infoFoto = view.FindViewById<ImageView>(Resource.Id.InfoWindowFoto);              
Picasso.Get().Load(customPin.local.Url_Imagem).Into(infoFoto);

Можете ли вы помочь мне исправить это, пожалуйста

РЕДАКТИРОВАТЬ:

также пробовал с FFImageloading:

if (infoFoto! = null) ImageService.Instance.LoadUrl (customPin.local.Url_Imagem) .Into (infoFoto);

Когда я нажимаю на булавку, изображение не появляется. Но если я нажму на булавке и представление закроется, и я нажмите на булавку еще раз, чтобы открыть вид, изображение появится быстро!

Мне нужно знать, можно ли обновить вид внутри карты после того, как изображение исчезло загружен ...

Мой образец: Пример проекта

1 Ответ

0 голосов
/ 02 сентября 2020

Отображаемое информационное окно не является просмотром в реальном времени. Представление отображается как изображение (с использованием View.draw(Canvas)) в момент его возврата. Это означает, что любые последующие изменения вида не будут отражены в информационном окне на карте.

Чтобы обновить информационное окно позже (например, после загрузки изображения), вызовите showInfoWindow().

Вы можете попробовать следующие коды:

private Bitmap bitmap;
public  Android.Views.View GetInfoContents(Marker marker)
    {
        var inflater = Android.App.Application.Context.GetSystemService(Context.LayoutInflaterService) as Android.Views.LayoutInflater;
        if (inflater != null)
        {
            Android.Views.View view;


            var customPin = GetCustomPin(marker);
            if (customPin == null)
            {
                throw new Exception("Local não localizado");
            }

            if (customPin.local.Name.Equals("Xamarin"))
            {
                view = inflater.Inflate(Resource.Layout.XamarinMapInfoWindow, null);
            }
            else
            {
                view = inflater.Inflate(Resource.Layout.MapInfoWindow, null);
            }

            var infoTitle = view.FindViewById<TextView>(Resource.Id.InfoWindowTitle);
            if (infoTitle != null) infoTitle.Text = marker.Title;
            var infoSubtitle = view.FindViewById<TextView>(Resource.Id.InfoWindowSubtitle);
            if (infoSubtitle != null) infoSubtitle.Text = marker.Snippet;
            var infoNote = view.FindViewById<TextView>(Resource.Id.InfoNote);
            if(infoNote != null) infoNote.Text = customPin.local.Note;
            var infoFoto = view.FindViewById<ImageView>(Resource.Id.InfoWindowFoto);
            if (infoFoto != null && bitmap == null)
            {
                GetImageBitmapFromUrlAsync(infoFoto, customPin.local.Url_Imagem, marker);
            }
            else
            {
                infoFoto.SetImageBitmap(bitmap);
            }
            return view;
        }
        return null;
    }
  

private async void GetImageBitmapFromUrlAsync(ImageView img, string url, Marker marker)
    {
        using (var webClient = new WebClient())
        {
            var imageBytes = await webClient.DownloadDataTaskAsync(url);
            if (imageBytes != null && imageBytes.Length > 0)
            {
                bitmap = await BitmapFactory.DecodeByteArrayAsync(imageBytes, 0, imageBytes.Length);
                marker.ShowInfoWindow();
            }
        }
        
    }   

если ваши image_urls не совпадают, вы можете использовать Dictionary для хранения растрового изображения, использовать URL-адрес в качестве ключа, растровое изображение как значение.

...