C# 如何修复';致命信号11';重新绘制到画布上时

C# 如何修复';致命信号11';重新绘制到画布上时,c#,xamarin.android,skiasharp,C#,Xamarin.android,Skiasharp,我正在尝试重新绘制SKCanvas上显示的形状。该方法(ChangeShape)在第一次从PaintSurface处理程序调用时工作正常,但当我再次尝试调用它时,应用程序崩溃,我收到错误“致命信号11(SIGSEGV),代码1(SEGV_MAPERR)” 我试图直接调用处理程序并初始化一个全新的SKSurface,但仍然会导致相同的错误 public LinearLayout ImageDivisionLayout_Obj; public SKCanvasView ImageViewActivi

我正在尝试重新绘制SKCanvas上显示的形状。该方法(ChangeShape)在第一次从PaintSurface处理程序调用时工作正常,但当我再次尝试调用它时,应用程序崩溃,我收到错误“致命信号11(SIGSEGV),代码1(SEGV_MAPERR)”

我试图直接调用处理程序并初始化一个全新的SKSurface,但仍然会导致相同的错误

public LinearLayout ImageDivisionLayout_Obj;
public SKCanvasView ImageViewActivity_Obj;
public SKSurface ImageCanvas;
public SKCanvas canvasSK;

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.activity_image);

    ImageViewActivity_Obj = new SKCanvasView(this);
    ImageViewActivity_Obj.PaintSurface += ImageViewActivity_Obj_PaintSurface;
    ImageDivisionLayout_Obj = (LinearLayout)FindViewById(Resource.Id.ImageLayoutDivision);
    ImageDivisionLayout_Obj.AddView(ImageViewActivity_Obj);

看看您正在做什么,我可以看出这可能在大多数平台上都不起作用。离开
ImageViewActivity\u Obj\u PaintSurface
方法后,将立即销毁存储在
ImageCanvas
字段中的
SKSurface
。曲面和画布对象是瞬态的,只有在方法运行时才有效

我假设你正在尝试创建某种绘图应用程序?如果是这样,有两种方法(尽管聪明的人可能会建议更多)。您可以将所有操作存储在某种类型的列表中。基本上,如果我画一个矩形,存储操作和边界

或者,您可以使用
SKSurface创建背景曲面。创建(…)
,然后在此基础上绘制。当绘制到屏幕时,只需将图像从背景画布复制到屏幕画布。然后,您也可以只保存背景画布,而不尝试捕获屏幕画布以保存到磁盘


我在这里做了一个简单的手指绘画应用程序,您可以查看它的想法:

您能在github提供一个示例吗,因为您的代码不完整,我将下载您的示例以尝试重现您的问题。@CherryBu MSFT,我下载了您的示例,但我可以找到.sln文件,所以不能在我身边运行您的示例。@CherryBu MSFT抱歉,我重新尝试了让我知道是否有效我尝试了您的代码,并且在调用ChangeShape方法两次时应用程序崩溃,所以我想知道您为什么调用此方法两次?
private void ImageViewActivity_Obj_PaintSurface(object sender, SKPaintSurfaceEventArgs e)
{
    SKImageInfo info = e.Info;
    SKSurface surface = e.Surface;
    ImageCanvas = surface;
    SetupCanvas();
}

public void SetupCanvas()
{
    ShapePaint = new SKPaint();
    ShapePaint.Color = SKColor.Parse("#F00000");
    ShapePaint.StrokeWidth = 25;
    ShapePaint.Style = SKPaintStyle.Stroke;

    ImageCanvas.Canvas.DrawBitmap(
        AndroidExtensions.ToSKBitmap(ImageTaken),
        new SKRect(0, 0, ImageViewActivity_Obj.Width, 
        ImageViewActivity_Obj.Height));

    ChangeShape();

    ImageCanvas.Canvas.Save();
}

public void ChangeShape()
{
    float X1 = CurrentShape.X;
    float Y1 = CurrentShape.Y;
    float X2 = CurrentShape.X + CurrentShape.width;
    float Y2 = CurrentShape.Y + CurrentShape.height;

    if (CurrentShape.name == "Rectangle")
    {
        ImageCanvas.Canvas.DrawRect(X1, Y1, X2, Y2, ShapePaint);
    }
    else if (CurrentShape.name == "Circle")
    {
        ImageCanvas.Canvas.DrawCircle(new SKPoint(X2 - X1, Y2 - Y1), CurrentShape.width / 2, ShapePaint);
    }
}