diff options
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Android/Renderers/ImageRenderer.cs | 108 |
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 |