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