Example #1
0
        async Task OnPageFinished(Android.Webkit.WebView view, string fileName, TaskCompletionSource <ToFileResult> taskCompletionSource)
        {
            var widthString = await view.EvaluateJavaScriptAsync("document.documentElement.offsetWidth");

            var width = double.Parse(widthString.ToString());

            var heightString = await view.EvaluateJavaScriptAsync("document.documentElement.offsetHeight");

            var height = double.Parse(heightString.ToString());

            int specWidth  = MeasureSpecFactory.MakeMeasureSpec((int)(width * Display.Scale), MeasureSpecMode.Exactly);
            int specHeight = MeasureSpecFactory.MakeMeasureSpec((int)(height * Display.Scale), MeasureSpecMode.Exactly);

            view.Measure(specWidth, specHeight);
            view.Layout(0, 0, view.MeasuredWidth, view.MeasuredHeight);

            await Task.Delay(50);

            using (var _dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments))
            {
                if (!_dir.Exists())
                {
                    _dir.Mkdir();
                }

                var path = _dir.Path + "/" + fileName + ".png";
                using (var file = new Java.IO.File(path))
                {
                    if (!file.Exists())
                    {
                        file.CreateNewFile();
                    }
                    using (var stream = new FileStream(file.Path, FileMode.Create, System.IO.FileAccess.Write))
                    {
                        if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Honeycomb)
                        {
                            await Task.Delay(1000);

                            using (var bitmap = Bitmap.CreateBitmap(System.Math.Max(view.MeasuredWidth, view.ContentWidth()), view.MeasuredHeight, Bitmap.Config.Argb8888))
                            {
                                using (var canvas = new Canvas(bitmap))
                                {
                                    if (view.Background != null)
                                    {
                                        view.Background.Draw(canvas);
                                    }
                                    else
                                    {
                                        canvas.DrawColor(Android.Graphics.Color.White);
                                    }

                                    view.SetClipChildren(false);
                                    view.SetClipToPadding(false);
                                    view.SetClipToOutline(false);

                                    await Task.Delay(50);

                                    view.Draw(canvas);
                                    await Task.Delay(50);

                                    bitmap.Compress(Bitmap.CompressFormat.Png, 80, stream);
                                }
                            }
                        }
                        else
                        {
                            await Task.Delay(1000);

#pragma warning disable CS0618 // Type or member is obsolete
                            using (var bitmap = Bitmap.CreateBitmap(view.DrawingCache))
#pragma warning restore CS0618 // Type or member is obsolete
                            {
                                bitmap.Compress(Bitmap.CompressFormat.Png, 80, stream);
                            }
                        }
                        stream.Flush();
                        stream.Close();
                        taskCompletionSource.SetResult(new ToFileResult(false, path));
                        view.Dispose();
                    }
                }
            }
        }