public void Draw(SKSurface surface, List <IGraphItem> graphItems) { SKCanvas canvas = surface.Canvas; foreach (var item in graphItems) { string type = item.GetType().ToString(); int pos = type.LastIndexOf('.'); type = type.Substring(pos + 1); switch (type) { case "GraphClear": GraphClear graphClear = item as GraphClear; canvas.Clear(graphClear.Color); break; case "GraphLine": GraphLine graphLine = item as GraphLine; canvas.DrawLine(graphLine.XPosStart, graphLine.YPosStart, graphLine.XPosEnd, graphLine.YPosEnd, GetLineBrush(graphLine)); break; case "GraphRectangle": GraphRectangle graphRectangle = item as GraphRectangle; var rect = SKRect.Create(graphRectangle.XPos, graphRectangle.YPos, graphRectangle.Width, graphRectangle.Height); canvas.DrawRect(rect, GetRectangleBrush(graphRectangle)); break; case "GraphText": GraphText graphText = item as GraphText; if (graphText.Rotation == 0) { canvas.DrawText(graphText.Text, graphText.XPos, graphText.YPos, GetTextBrush(graphText)); } else { using (new SKAutoCanvasRestore(canvas)) // https://stackoverflow.com/questions/41908497/draw-rotated-text-in-skiasharp { // do any transformations canvas.RotateDegrees(graphText.Rotation, graphText.XPos, graphText.YPos); // do serious work canvas.DrawText(graphText.Text, graphText.XPos, graphText.YPos, GetTextBrush(graphText)); // auto restore, even on exceptions or errors } } break; case "GraphCircle": GraphCircle graphCircle = item as GraphCircle; canvas.DrawCircle(graphCircle.XPos, graphCircle.YPos, graphCircle.Radius, GetCircleBrush(graphCircle)); break; } } }
SKPaint GetCircleBrush(GraphCircle graphCircle) { SKPaint brush; string key = $"{graphCircle.Color}{graphCircle.StrokeWidth}{graphCircle.PaintStyle}"; if (lineBrushes.ContainsKey(key)) { brush = lineBrushes[key]; } else { brush = new SKPaint { Style = graphCircle.PaintStyle, Color = graphCircle.Color, StrokeWidth = graphCircle.StrokeWidth }; lineBrushes[key] = brush; } return(brush); }