void SetImagePlaceholder()
        {
            if (Element.ImagePlaceholder != null)
            {
                var placeholder = Element.ImagePlaceholder as FileImageSource;
                if (placeholder != null && placeholder.File != null)
                {
                    var resourceID = UIHelper.GetDrawableResource(placeholder);
                    //Bitmap imageBitmap = BitmapFactory.DecodeResource(Context.Resources, resourceID);

                    //SetImageCorners(imageBitmap);

                    if (resourceID > 0)
                    {
                        Bitmap imageBitmap = ImageCache.Instance.Get(resourceID.ToString());
                        if (imageBitmap == null)
                        {
                            BitmapWorkerTask task = new BitmapWorkerTask(imageView, -1, -1, ImageCache.Instance);
                            imageView.SetImageDrawable(new AsyncDrawable(imageView.Resources, null, task));
                            task.Execute(resourceID);
                            task.Finished += (s, e) =>
                                             SetImageCorners(e);
                        }
                        else
                        {
                            SetImageCorners(imageBitmap);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
 public AsyncDrawable(Resources res, Bitmap bitmap,
                      BitmapWorkerTask bitmapWorkerTask)
     : base(res, bitmap)
 {
     bitmapWorkerTaskReference =
         new WeakReference <BitmapWorkerTask>(bitmapWorkerTask);
 }
Ejemplo n.º 3
0
        public static bool CancelPotentialWork(int data, ImageView imageView)
        {
            BitmapWorkerTask bitmapWorkerTask = GetBitmapWorkerTask(imageView);

            if (bitmapWorkerTask != null)
            {
                int bitmapData = bitmapWorkerTask.data;
                // If bitmapData is not yet set or it differs from the new data
                if (bitmapData == 0 || bitmapData != data)
                {
                    // Cancel previous task
                    bitmapWorkerTask.Cancel(true);
                }
                else
                {
                    // The same work is already in progress
                    return(false);
                }
            }
            // No task associated with the ImageView, or an existing task was cancelled
            return(true);
        }
        async void SetImageSource()
        {
            if (Element.Source != null)
            {
                if (Element.Source is UriImageSource)
                {
                    isImageInitialSet = true;


                    var uri = Element.Source.GetValue(UriImageSource.UriProperty) as Uri;

                    var bitmap = await imageDownloader.GetImageAsync(uri);

                    SetImageCorners(bitmap);
                }
                else if (Element.Source is FileImageSource)
                {
                    if ((Element.Width > 0 && Element.Height > 0) || (Element.WidthRequest > 0 && Element.HeightRequest > 0))
                    {
                        isImageInitialSet = true;

                        var source = Element.Source as FileImageSource;
                        if (source != null && source.File != null)
                        {
                            var resourceID = UIHelper.GetDrawableResource(source);
                            if (resourceID > 0)
                            {
                                Bitmap imageBitmap = ImageCache.Instance.Get(resourceID.ToString());
                                if (imageBitmap == null)
                                {
                                    var width             = BaseUIHelper.ConvertDPToPixels(Element.Width <= 0 ? Element.WidthRequest : Element.Width);
                                    var height            = BaseUIHelper.ConvertDPToPixels(Element.Height <= 0 ? Element.HeightRequest : Element.Height);
                                    BitmapWorkerTask task = new BitmapWorkerTask(imageView, width, height, ImageCache.Instance);
                                    imageView.SetImageDrawable(new AsyncDrawable(imageView.Resources, null, task));
                                    task.Execute(resourceID);
                                    task.Finished += (s, e) =>
                                                     SetImageCorners(e);
                                }
                                else
                                {
                                    SetImageCorners(imageBitmap);
                                }
                            }
                            else
                            {
                                var imageBitmap = await BitmapFactory.DecodeFileAsync(source.File);

                                SetImageCorners(imageBitmap);
                            }
                        }
                    }
                }
                else if (Element.Source is StreamImageSource)
                {
                    isImageInitialSet = true;
                    var source = Element.Source as StreamImageSource;
                    var cts    = new System.Threading.CancellationTokenSource();
                    var str    = await source.Stream(cts.Token);

                    using (var reader = new System.IO.BinaryReader(str))
                    {
                        var data   = reader.ReadBytes((int)str.Length);
                        var bitmap = await BitmapFactory.DecodeByteArrayAsync(data, 0, data.Length);

                        SetImageCorners(bitmap);
                    }
                }
            }
            else
            {
                if (Element.ImagePlaceholder == null)
                {
                    imageView.SetImageBitmap(null);
                }
            }
        }
        private async void UpdateBitmap(Image previous = null)
        {
            if (Element == null || Control == null)
            {
                return;
            }

            Bitmap      bitmap = null;
            ImageSource source = Element.Source;

            if (previous == null || !object.Equals(previous.Source, Element.Source))
            {
                SetIsLoading(true);
                ((CustomImageView)base.Control).SkipInvalidate();

                // I'm not sure where this comes from.
                //   Control.SetImageResource(17170445);

                if (BaseControl.ImagePlaceholder != null)
                {
                    var placeholder = BaseControl.ImagePlaceholder as FileImageSource;

                    var resourceID = UIHelper.GetDrawableResource(placeholder);
                    if (resourceID > 0)
                    {
                        Bitmap imageBitmap = imageCache.Get(resourceID.ToString());
                        //imageBitmap = BitmapFactory.DecodeResource(Context.Resources, resourceID);

                        if (imageBitmap == null)
                        {
                            BitmapWorkerTask task = new BitmapWorkerTask(Control, -1, -1, imageCache);
                            Control.SetImageDrawable(new AsyncDrawable(Control.Resources, null, task));
                            task.Execute(resourceID);
                            task.Finished += (s, e) =>
                            {
                                Control.SetImageBitmap(e);
                                e.Dispose();
                            };
                        }
                        else
                        {
                            Control.SetImageBitmap(imageBitmap);
                            imageBitmap.Dispose();
                        }
                    }
                }


                if (source != null)
                {
                    try
                    {
                        bitmap = await GetImageFromImageSource(source, Context);
                    }
                    catch (TaskCanceledException)
                    {
                    }
                    catch (IOException)
                    {
                    }
                    catch (NotImplementedException)
                    {
                    }
                }

                if (Element != null && object.Equals(Element.Source, source))
                {
                    if (!_isDisposed)
                    {
                        if (bitmap == null && BaseControl.ImagePlaceholder != null)
                        {
                        }
                        else
                        {
                            Control.SetImageBitmap(bitmap);
                        }

                        if (bitmap != null)
                        {
                            bitmap.Dispose();
                        }
                        SetIsLoading(false);
                        ((IVisualElementController)base.Element).NativeSizeChanged();
                    }
                }
            }
        }