Xamarin.iOS скриншот с прозрачным фоном - PullRequest
0 голосов
/ 15 февраля 2019

Я создаю приложение, которое пользователи могут загрузить отчет и нарисовать на экране для выделения и поделиться некоторой информацией (в виде изображения).Я разрабатываю эту функцию, используя Rg.Plugins.Popup.Pages.PopupPage и SkiaSharp.Всплывающая страница имеет прозрачный фон и кнопку общего доступа.Пользователи рисуют на всплывающей странице.В Android это работает нормально, потому что я могу сделать снимок всего экрана, используя currentview.Window.DecorView.RootView, но в iOS, когда я делаю скриншот, изображение становится черным фоном.Чтобы сделать снимок экрана, я использую следующий код:

public void ShareContent(string imageName)
{
    UIGraphics.BeginImageContextWithOptions(new CoreGraphics.CGSize(UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height), false, 0);
    UIImage capture = UIApplication.SharedApplication.KeyWindow.Capture(); 
    UIGraphics.EndImageContext();

    var activityItems = new[] { capture };
    var activityController = new UIActivityViewController(activityItems, null);
    var topController = UIApplication.SharedApplication.KeyWindow.RootViewController;

    while (topController.PresentedViewController != null)
    {
        topController = topController.PresentedViewController;
    }

    topController.PresentViewController(activityController, true, () => { });
}

Как нарисовать изображение с прозрачным фоном в Xamarin iOS?

Код за PopupPage в общем проекте

public partial class DrawAndSharePage : Rg.Plugins.Popup.Pages.PopupPage
{
    Dictionary<long, SKPath> inProgressPaths = new Dictionary<long, SKPath>();
    List<SKPath> completedPaths = new List<SKPath>();

    SKPaint paint = new SKPaint
    {
        Style = SKPaintStyle.Stroke,
        Color = SKColors.Blue,
        StrokeWidth = 10,
        StrokeCap = SKStrokeCap.Round,
        StrokeJoin = SKStrokeJoin.Round
    };

    public DrawAndSharePage()
    {
        BackgroundColor = new Color(0, 0, 0, 0.1);
        InitializeComponent();
    }

    private async void BtnClose_Clicked(object sender, System.EventArgs e)
    {
        await Rg.Plugins.Popup.Services.PopupNavigation.Instance.PopAllAsync();
    }

    void OnTouchEffectAction(object sender, TouchActionEventArgs args)
    {
        switch (args.Type)
        {
            case TouchActionType.Pressed:
                if (!inProgressPaths.ContainsKey(args.Id))
                {
                    SKPath path = new SKPath();
                    path.MoveTo(ConvertToPixel(args.Location));
                    inProgressPaths.Add(args.Id, path);
                    canvasView.InvalidateSurface();
                }
                break;

            case TouchActionType.Moved:
                if (inProgressPaths.ContainsKey(args.Id))
                {
                    SKPath path = inProgressPaths[args.Id];
                    path.LineTo(ConvertToPixel(args.Location));
                    canvasView.InvalidateSurface();
                }
                break;

            case TouchActionType.Released:
                if (inProgressPaths.ContainsKey(args.Id))
                {
                    completedPaths.Add(inProgressPaths[args.Id]);
                    inProgressPaths.Remove(args.Id);
                    canvasView.InvalidateSurface();
                }
                break;

            case TouchActionType.Cancelled:
                if (inProgressPaths.ContainsKey(args.Id))
                {
                    inProgressPaths.Remove(args.Id);
                    canvasView.InvalidateSurface();
                }
                break;
        }
    }

    void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
    {
        SKCanvas canvas = args.Surface.Canvas;
        canvas.Clear();

        foreach (SKPath path in completedPaths)
        {
            canvas.DrawPath(path, paint);
        }

        foreach (SKPath path in inProgressPaths.Values)
        {
            canvas.DrawPath(path, paint);
        }
    }

    SKPoint ConvertToPixel(Point pt)
    {
        return new SKPoint((float)(canvasView.CanvasSize.Width * pt.X / canvasView.Width),
                           (float)(canvasView.CanvasSize.Height * pt.Y / canvasView.Height));
    }

    private void OnTouchEffectAction(object sender, object args)
    {

    }
}
...