2017-09-27 113 views
0

我最近使用SkiaSharp碰到了一个路障。我一直在将旧的代码从System.Drawing移植到SkiaSharp。 GraphicsPath类有一个扁平方法,将曲线转换为一系列连接的线段。SkiaSharp是否具有与System.Drawing等效的Flatten方法?

https://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.flatten(v=vs.110).aspx

我似乎无法找到SkiaSharp等效的方法。 SKPath Simplify方法对于实际的功能似乎有些模糊。在我的测试中,它似乎没有产生平坦的路径。

https://developer.xamarin.com/api/member/SkiaSharp.SKPath.Simplify()/

回答

0

在某一点后,我问这个问题,Xamarin添加文档做到这一点。它坐落在这里

https://developer.xamarin.com/guides/xamarin-forms/advanced/skiasharp/curves/information/

static class PathExtensions 
{ 
public static SKPath CloneWithTransform(this SKPath pathIn, Func<SKPoint, SKPoint> transform) 
{ 
    SKPath pathOut = new SKPath(); 

    using (SKPath.RawIterator iterator = pathIn.CreateRawIterator()) 
    { 
     SKPoint[] points = new SKPoint[4]; 
     SKPathVerb pathVerb = SKPathVerb.Move; 
     SKPoint firstPoint = new SKPoint(); 
     SKPoint lastPoint = new SKPoint(); 

     while ((pathVerb = iterator.Next(points)) != SKPathVerb.Done) 
     { 
      switch (pathVerb) 
      { 
       case SKPathVerb.Move: 
        pathOut.MoveTo(transform(points[0])); 
        firstPoint = lastPoint = points[0]; 
        break; 

       case SKPathVerb.Line: 
        SKPoint[] linePoints = Interpolate(points[0], points[1]); 

        foreach (SKPoint pt in linePoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[1]; 
        break; 

       case SKPathVerb.Cubic: 
        SKPoint[] cubicPoints = FlattenCubic(points[0], points[1], points[2], points[3]); 

        foreach (SKPoint pt in cubicPoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[3]; 
        break; 

       case SKPathVerb.Quad: 
        SKPoint[] quadPoints = FlattenQuadratic(points[0], points[1], points[2]); 

        foreach (SKPoint pt in quadPoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[2]; 
        break; 

       case SKPathVerb.Conic: 
        SKPoint[] conicPoints = FlattenConic(points[0], points[1], points[2], iterator.ConicWeight()); 

        foreach (SKPoint pt in conicPoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        lastPoint = points[2]; 
        break; 

       case SKPathVerb.Close: 
        SKPoint[] closePoints = Interpolate(lastPoint, firstPoint); 

        foreach (SKPoint pt in closePoints) 
        { 
         pathOut.LineTo(transform(pt)); 
        } 

        firstPoint = lastPoint = new SKPoint(0, 0); 
        pathOut.Close(); 
        break; 
      } 
     } 
    } 
    return pathOut; 
} 
... 
} 
相关问题