static async Task UpdateBitmap( this AImageView imageView, IImageElement newView, IImageElement previousView, ImageSource newImageSource, ImageSource previousImageSource) { IImageController imageController = newView as IImageController; newImageSource = newImageSource ?? newView?.Source; previousImageSource = previousImageSource ?? previousView?.Source; if (imageView.IsDisposed()) { return; } if (newImageSource != null && Equals(previousImageSource, newImageSource)) { return; } imageController?.SetIsLoading(true); (imageView as IImageRendererController)?.SkipInvalidate(); imageView.SetImageResource(global::Android.Resource.Color.Transparent); try { if (newImageSource != null) { var imageViewHandler = Internals.Registrar.Registered.GetHandlerForObject <IImageViewHandler>(newImageSource); if (imageViewHandler != null) { await imageViewHandler.LoadImageAsync(newImageSource, imageView); } else { using (var drawable = await imageView.Context.GetFormsDrawableAsync(newImageSource)) { // only set the image if we are still on the same one if (!imageView.IsDisposed() && Equals(newView?.Source, newImageSource)) { imageView.SetImageDrawable(drawable); } } } } } finally { // only mark as finished if we are still working on the same image if (Equals(newView?.Source, newImageSource)) { imageController?.SetIsLoading(false); imageController?.NativeSizeChanged(); } } }
// TODO hartez 2017/04/07 09:33:03 Review this again, not sure it's handling the transition from previousImage to 'null' newImage correctly static async Task UpdateBitmap( this AImageView imageView, IImageElement newView, IImageElement previousView, ImageSource newImageSource, ImageSource previousImageSource) { IImageController imageController = newView as IImageController; newImageSource = newImageSource ?? newView?.Source; previousImageSource = previousImageSource ?? previousView?.Source; if (imageView.IsDisposed()) { return; } if (newImageSource != null && Equals(previousImageSource, newImageSource)) { return; } imageController?.SetIsLoading(true); (imageView as IImageRendererController)?.SkipInvalidate(); imageView.SetImageResource(global::Android.Resource.Color.Transparent); bool setByImageViewHandler = false; Bitmap bitmap = null; try { if (newImageSource != null) { var imageViewHandler = Internals.Registrar.Registered.GetHandlerForObject <IImageViewHandler>(newImageSource); if (imageViewHandler != null) { await imageViewHandler.LoadImageAsync(newImageSource, imageView); setByImageViewHandler = true; } else { var imageSourceHandler = Internals.Registrar.Registered.GetHandlerForObject <IImageSourceHandler>(newImageSource); bitmap = await imageSourceHandler.LoadImageAsync(newImageSource, imageView.Context); } } } catch (TaskCanceledException) { imageController?.SetIsLoading(false); } // Check if the source on the new image has changed since the image was loaded if (!Equals(newView?.Source, newImageSource)) { bitmap?.Dispose(); return; } if (!setByImageViewHandler && !imageView.IsDisposed()) { if (bitmap == null && newImageSource is FileImageSource) { imageView.SetImageResource(ResourceManager.GetDrawableByName(((FileImageSource)newImageSource).File)); } else { imageView.SetImageBitmap(bitmap); } } bitmap?.Dispose(); imageController?.SetIsLoading(false); imageController?.NativeSizeChanged(); }
static async Task UpdateBitmap( this AImageView imageView, IImageElement newView, IImageElement previousView, ImageSource newImageSource, ImageSource previousImageSource) { IImageController imageController = newView as IImageController; newImageSource = newImageSource ?? newView?.Source; previousImageSource = previousImageSource ?? previousView?.Source; if (imageView.IsDisposed()) { return; } if (newImageSource != null && Equals(previousImageSource, newImageSource)) { return; } imageController?.SetIsLoading(true); (imageView as IImageRendererController)?.SkipInvalidate(); imageView.Reset(); imageView.SetImageResource(global::Android.Resource.Color.Transparent); try { if (newImageSource != null) { // all this animation code will go away if/once we pull in GlideX IFormsAnimationDrawable animation = null; if (imageController.GetLoadAsAnimation()) { var animationHandler = Registrar.Registered.GetHandlerForObject <IAnimationSourceHandler>(newImageSource); if (animationHandler != null) { animation = await animationHandler.LoadImageAnimationAsync(newImageSource, imageView.Context); } } if (animation == null) { var imageViewHandler = Registrar.Registered.GetHandlerForObject <IImageViewHandler>(newImageSource); if (imageViewHandler != null) { await imageViewHandler.LoadImageAsync(newImageSource, imageView); } else { using (var drawable = await imageView.Context.GetFormsDrawableAsync(newImageSource)) { // only set the image if we are still on the same one if (!imageView.IsDisposed() && SourceIsNotChanged(newView, newImageSource)) { imageView.SetImageDrawable(drawable); } } } } else { if (!imageView.IsDisposed() && SourceIsNotChanged(newView, newImageSource)) { imageView.SetImageDrawable(animation.ImageDrawable); } else { animation?.Reset(); animation?.Dispose(); } } } else { imageView.SetImageBitmap(null); } } finally { // only mark as finished if we are still working on the same image if (SourceIsNotChanged(newView, newImageSource)) { imageController?.SetIsLoading(false); imageController?.NativeSizeChanged(); } } bool SourceIsNotChanged(IImageElement imageElement, ImageSource imageSource) { return((imageElement != null) ? imageElement.Source == imageSource : true); } }
public static async Task SetImage(IImageVisualElementRenderer renderer, IImageController imageElement, Image oldElement = null) { _ = renderer ?? throw new ArgumentNullException($"{nameof(ImageElementManager)}.{nameof(SetImage)} {nameof(renderer)} cannot be null"); _ = imageElement ?? throw new ArgumentNullException($"{nameof(ImageElementManager)}.{nameof(SetImage)} {nameof(imageElement)} cannot be null"); var Element = renderer.Element; var Control = renderer.GetImage(); if (renderer.IsDisposed || Element == null || Control == null) { return; } var source = imageElement.Source; if (oldElement != null) { var oldSource = oldElement.Source; if (Equals(oldSource, source)) { return; } if (oldSource is FileImageSource && source is FileImageSource && ((FileImageSource)oldSource).File == ((FileImageSource)source).File) { return; } renderer.SetImage(null); } IImageSourceHandler handler; imageElement.SetIsLoading(true); try { if (source != null && (handler = Internals.Registrar.Registered.GetHandlerForObject <IImageSourceHandler>(source)) != null) { UIImage uiimage; try { uiimage = await handler.LoadImageAsync(source, scale : (float)UIScreen.MainScreen.Scale); } catch (OperationCanceledException) { uiimage = null; } if (renderer.IsDisposed) { return; } var imageView = Control; if (imageView != null) { renderer.SetImage(uiimage); } } else { renderer.SetImage(null); } } finally { imageElement.SetIsLoading(false); } (imageElement as IViewController)?.NativeSizeChanged(); }