summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs')
-rw-r--r--Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs108
1 files changed, 108 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs
new file mode 100644
index 00000000..a080e58b
--- /dev/null
+++ b/Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs
@@ -0,0 +1,108 @@
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Threading.Tasks;
+using Android.Graphics;
+using AImageView = Android.Widget.ImageView;
+
+namespace Xamarin.Forms.Platform.Android
+{
+ public class ImageRenderer : ViewRenderer<Image, AImageView>
+ {
+ bool _isDisposed;
+
+ public ImageRenderer()
+ {
+ AutoPackage = false;
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (_isDisposed)
+ return;
+
+ _isDisposed = true;
+
+ base.Dispose(disposing);
+ }
+
+ protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
+ {
+ base.OnElementChanged(e);
+
+ if (e.OldElement == null)
+ {
+ var view = new FormsImageView(Context);
+ SetNativeControl(view);
+ }
+
+ UpdateBitmap(e.OldElement);
+ UpdateAspect();
+ }
+
+ protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ base.OnElementPropertyChanged(sender, e);
+
+ if (e.PropertyName == Image.SourceProperty.PropertyName)
+ UpdateBitmap();
+ else if (e.PropertyName == Image.AspectProperty.PropertyName)
+ UpdateAspect();
+ }
+
+ void UpdateAspect()
+ {
+ AImageView.ScaleType type = Element.Aspect.ToScaleType();
+ Control.SetScaleType(type);
+ }
+
+ async void UpdateBitmap(Image previous = null)
+ {
+ if (Device.IsInvokeRequired)
+ throw new InvalidOperationException("Image Bitmap must not be updated from background thread");
+
+ Bitmap bitmap = null;
+
+ ImageSource source = Element.Source;
+ IImageSourceHandler handler;
+
+ if (previous != null && Equals(previous.Source, Element.Source))
+ return;
+
+ ((IElementController)Element).SetValueFromRenderer(Image.IsLoadingPropertyKey, true);
+
+ var formsImageView = Control as FormsImageView;
+ if (formsImageView != null)
+ formsImageView.SkipInvalidate();
+
+ Control.SetImageResource(global::Android.Resource.Color.Transparent);
+
+ if (source != null && (handler = Registrar.Registered.GetHandler<IImageSourceHandler>(source.GetType())) != null)
+ {
+ try
+ {
+ bitmap = await handler.LoadImageAsync(source, Context);
+ }
+ catch (TaskCanceledException)
+ {
+ }
+ catch (IOException e)
+ {
+ }
+ }
+
+ if (Element == null || !Equals(Element.Source, source))
+ return;
+
+ if (!_isDisposed)
+ {
+ Control.SetImageBitmap(bitmap);
+ if (bitmap != null)
+ bitmap.Dispose();
+
+ ((IElementController)Element).SetValueFromRenderer(Image.IsLoadingPropertyKey, false);
+ ((IVisualElementController)Element).NativeSizeChanged();
+ }
+ }
+ }
+} \ No newline at end of file