首页 文章

SkiaSharp不会使用StrokeAndFill填充三角形

提问于
浏览
1

我正在尝试绘制并填充三角形 . 我提到了一个android - 问题How to draw filled triangle on android Canvas并做了以下事情 . 它绘制三角形但不填充它 . 怎么弄它?此外,它是否可以填充不同于线条颜色的颜色?

Xamarin Forms

private void OnPainting(object sender, SKPaintSurfaceEventArgs e)
{
        var surface = e.Surface;
        var canvas = surface.Canvas;
        canvas.Clear(SKColors.White);


        var pathStroke2 = new SKPaint
        {
            IsAntialias = true,
            Style = SKPaintStyle.StrokeAndFill,
            Color = new SKColor(244, 0, 110, 200),
            StrokeWidth = 5
        };

        var path2 = new SKPath { FillType = SKPathFillType.EvenOdd };
        path2.MoveTo(0, 0);
        path2.LineTo(0, 140);
        path2.MoveTo(0, 140);
        path2.LineTo(140, 140);
        path2.MoveTo(140, 140);
        path2.LineTo(0, 0);
        path2.Close();
        canvas.DrawPath(path2, pathStroke2);

    }

enter image description here

2 回答

  • 4

    你不需要同时使用LineTo()和MoveTo() - 我怀疑这样做是打破填充算法 . 相反,只需使用

    path2.MoveTo(0, 0);
    path2.LineTo(0, 140);
    path2.LineTo(140, 140);
    path2.LineTo(0, 0);
    path2.Close();
    
  • 0

    根据杰森的评论,删除不需要的MoveTo线解决了它 .

    以下是完整的代码 .

    private void OnPainting(object sender, SKPaintSurfaceEventArgs e)
       {
    
            var surface = e.Surface;
            var canvas = surface.Canvas;
            canvas.Clear(SKColors.White);
    
            var w = e.Info.Width;
            var h = e.Info.Height;
    
            SKColor[] colors;
            colors = new SKColor[] {
                     new SKColor(244, 0, 110, 200), new SKColor(244, 0, 110, 220),
                     new SKColor(244, 0, 110, 240),new SKColor(244, 0, 110, 240),
                     new SKColor(244, 0, 100,240),
                     new SKColor(244, 0, 100),
                     new SKColor(255, 0, 70)
                    };
            SKShader shaderLeft = SKShader.CreateLinearGradient(new SKPoint(0, 0), new SKPoint(w, h), colors, null, SKShaderTileMode.Clamp);
            var paint = new SKPaint() { Shader = shaderLeft };
            canvas.DrawPaint(paint);
    
    
           var path2 = new SKPath { FillType = SKPathFillType.EvenOdd };
            path2.MoveTo(0, 0);
            path2.LineTo(0, 140);
            path2.LineTo(140, 140);
            path2.LineTo(0, 0);
            path2.Close();
    
            var pathStroke2 = new SKPaint
            {
                IsAntialias = true,
                Style = SKPaintStyle.StrokeAndFill,
                Color = new SKColor(0, 0, 0, 30),
                StrokeWidth = 5
            };
    
            using (var cf = SKColorFilter.CreateBlendMode(new SKColor(244, 0, 110, 200), SKBlendMode.DstIn))
            {
                var transparency = SKColors.White.WithAlpha(127); 
                pathStroke2.ColorFilter = cf;
    
                // ... draw ...
                canvas.DrawPath(path2, pathStroke2);
    
                pathStroke2.ColorFilter = null;
            }
    
            var pathStroke3 = new SKPaint
            {
                IsAntialias = true,
                Style = SKPaintStyle.StrokeAndFill,
                Color = new SKColor(0, 0, 0, 30),
                StrokeWidth = 5
            };
    
            var path3 = new SKPath { FillType = SKPathFillType.EvenOdd };
            path3.MoveTo(170, 0);
            path3.LineTo(170, 140);
            path3.LineTo(300, 140);
            path3.LineTo(170, 0);
            path3.Close();
            canvas.DrawPath(path3, pathStroke3);
    
        }
    

    enter image description here

相关问题