blob: f60acb7e7ddc59127c1921edd8db3e8033990d93 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
using System;
using System.Threading.Tasks;
using Android.Graphics;
using Java.IO;
using AImageView = Android.Widget.ImageView;
namespace Xamarin.Forms.Platform.Android
{
internal static class ImageViewExtensions
{
public static async void UpdateBitmap(this AImageView imageView, Image newImage, Image previousImage = null)
{
if (Device.IsInvokeRequired)
throw new InvalidOperationException("Image Bitmap must not be updated from background thread");
if (previousImage != null && Equals(previousImage.Source, newImage.Source))
return;
((IImageController)newImage).SetIsLoading(true);
(imageView as IImageRendererController).SkipInvalidate();
imageView.SetImageResource(global::Android.Resource.Color.Transparent);
ImageSource source = newImage.Source;
Bitmap bitmap = null;
IImageSourceHandler handler;
if (source != null && (handler = Internals.Registrar.Registered.GetHandler<IImageSourceHandler>(source.GetType())) != null)
{
try
{
bitmap = await handler.LoadImageAsync(source, imageView.Context);
}
catch (TaskCanceledException)
{
}
catch (IOException ex)
{
Internals.Log.Warning("Xamarin.Forms.Platform.Android.ImageRenderer", "Error updating bitmap: {0}", ex);
}
}
if (newImage == null || !Equals(newImage.Source, source))
{
bitmap?.Dispose();
return;
}
if (bitmap == null && source is FileImageSource)
imageView.SetImageResource(ResourceManager.GetDrawableByName(((FileImageSource)source).File));
else
imageView.SetImageBitmap(bitmap);
bitmap?.Dispose();
((IImageController)newImage).SetIsLoading(false);
((IVisualElementController)newImage).NativeSizeChanged();
}
}
}
|