SkiaSharp的SKRect中的触摸坐标和绘制的路径不匹配

时间:2019-03-26 19:59:00

标签: xamarin xamarin.forms skiasharp

我试图在位图上绘制位图并将其放置在SKRect中,因为图像的尺寸要比设备屏幕大。一切正常,我什至可以画画。但是,触摸坐标与位图上的绘制路径不匹配。 (即我触摸画布的一侧,并在其他点绘制)。我没有得到什么问题,仅当我在SKRect中放置位码时才会发生。

我点击了此链接,但没有找到任何答案。我什至跟随Xamarin Microsoft Documents,我在做同样的事情,但是没有解决方案。我只是想在位图上画手指。

drawing on bitmap using skiasharp in xamarin

这是我的代码。

 void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
    SKImageInfo info = args.Info;
    SKSurface surface = args.Surface;
    SKCanvas canvas = surface.Canvas;

    float scale = Math.Min((float)info.Width / bitmap.Width, 
                           (float)info.Height / bitmap.Height);
    float x = (info.Width - scale * bitmap.Width) / 2;
    float y = (info.Height - scale * bitmap.Height) / 2;
    SKRect destRect = new SKRect(x, y, x + scale * bitmap.Width, 
                                       y + scale * bitmap.Height);

    canvas.DrawBitmap(bitmap, destRect);

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

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

void OnTouchEffectAction(object sender, TouchActionEventArgs args)
{
    switch (args.Type)
    {
        case TouchActionType.Pressed:
            if (!inProgressPaths.ContainsKey(args.Id))
            {
                SKPath path = new SKPath();
                path.MoveTo((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((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;
    }
}

我不仅尝试转储代码,而且能够绘制,只是不采用SKRect坐标。

请任何帮助将非常有帮助。谢谢

0 个答案:

没有答案