public void DrawRectangle(Pen pen, RectangleF paintRect) { if (SmoothingMode == SmoothingMode.AntiAlias || pen.Alignment == PenAlignment.Center) //todo:临时解决方法 { //apply antialiasing offset (if required and if no scaling is in effect) if (Transform.Rotation <= 0) { paintRect.X += AA_OFFSET_X; paintRect.Y += AA_OFFSET_Y; } else { if (paintRect.X > AA_OFFSET_X) { paintRect.X -= AA_OFFSET_X; } if (paintRect.Y > AA_OFFSET_Y) { paintRect.Y -= AA_OFFSET_Y; } } var x2 = paintRect.X + paintRect.Width; var y2 = paintRect.Y + paintRect.Height; paintRect = new RectangleF(paintRect.X, paintRect.Y, x2 - paintRect.X, y2 - paintRect.Y); } var r = Convert(paintRect); pen.ApplyToSKPaint(skPaint); skCanvas.DrawRect(r, skPaint); skPaint.Reset(); }
/// <inheritdoc /> public void Dispose() { if (_disposePaint) { Paint?.Dispose(); } else { Paint?.Reset(); } _disposable1?.Dispose(); _disposable2?.Dispose(); _disposable3?.Dispose(); }
public static BoxShadowFilter Create(SKPaint paint, BoxShadow shadow, double opacity) { var ac = shadow.Color; SKImageFilter filter = null; filter = SKImageFilter.CreateBlur(SkBlurRadiusToSigma(shadow.Blur), SkBlurRadiusToSigma(shadow.Blur)); var color = new SKColor(ac.R, ac.G, ac.B, (byte)(ac.A * opacity)); paint.Reset(); paint.IsAntialias = true; paint.Color = color; paint.ImageFilter = filter; return(new BoxShadowFilter { Paint = paint, _filter = filter, ClipOperation = shadow.IsInset ? SKClipOperation.Intersect : SKClipOperation.Difference }); }
public virtual void DrawThumb(SKCanvas canvas, float progress, float hSpace, RectangleF rectangle) { using var paint = new SKPaint(); var fillColor = TypedVirtualView.GetThumbColor(defaultThumbColor, CurrentState).ToSKColor(); ThumbRect.X = (rectangle.Width - (hSpace * 2) - ThumbRect.Width) * progress + hSpace; ThumbRect.Y = rectangle.Y + (rectangle.Height - ThumbRect.Height) / 2; TouchTargetRect.Center(ThumbRect.Center()); var knobRect = ThumbRect.ToSKRect(); using var knobPath = new SKPath(); knobPath.Reset(); knobPath.AddOval(knobRect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = fillColor; canvas.DrawPath(knobPath, paint); }
public virtual void DrawProgress(SKCanvas canvas, float progress, float hSpace, RectangleF rectangle) { using var paint = new SKPaint(); var fillColor = TypedVirtualView.GetProgressColor(defaultProgressColor, CurrentState).ToSKColor(); var width = (rectangle.Width - (hSpace * 2)) * progress; var height = defaultHeight; var y = rectangle.Y + ((rectangle.Height - height) / 2); var highlightRect = new RectangleF(hSpace, y, width, height).ToSKRect(); var trackRect = highlightRect; using var trackPath = new SKPath(); trackPath.Reset(); trackPath.AddRoundRect(trackRect, 1f, 1f, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = fillColor; canvas.DrawPath(trackPath, paint); }
public virtual void DrawTrack(SKCanvas canvas, float hSpace, RectangleF rectangle) { using var paint = new SKPaint(); var fillColor = TypedVirtualView.GetTrackColor(defaultTrackColor, CurrentState).ToSKColor(); TrackRect.Width = rectangle.Width - (hSpace * 2); TrackRect.Height = defaultHeight; TrackRect.Y = rectangle.Y + ((rectangle.Height - TrackRect.Height) / 2); TrackRect.X = hSpace; var highlightRect = TrackRect.ToSKRect(); //var highlightRect = rectangle.ApplyPadding(new Thickness(hSpace, vSpace)).ToSKRect(); using var highlightPath = new SKPath(); highlightPath.Reset(); highlightPath.AddRoundRect(highlightRect, 1f, 1f, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = fillColor; canvas.DrawPath(highlightPath, paint); }
public void Dispose() { Paint.Reset(); Paint = null; _filter?.Dispose(); }
public static void drawClock(SKCanvas canvas, Context context, SKRect targetFrame, ResizingBehavior resizing, SKColor numbersColor, SKColor darkHandsColor, SKColor lightHandColor, SKColor rimColor, SKColor tickColor, SKColor faceColor, float hours, float minutes, float seconds) { // General Declarations // Stack<Matrix> currentTransformation = new Stack<Matrix>(); // skipping - we do not support Matrix yet // currentTransformation.push(new Matrix()); // skipping - we do not support Matrix yet SKPaint paint = CacheForClock.paint; // Local Variables String expression = hours > 12f ? "PM" : "AM"; float secondsAngle = -seconds / 60f * 360f; float minuteAngle = -(minutes / 60f * 360f - secondsAngle / 60f); float hourAngle = -hours / 12f * 360f + minuteAngle / 12f; // Resize to Target Frame canvas.Save(); var resizedFrame = Helpers.ResizingBehaviorApply(resizing, CacheForClock.originalFrame, targetFrame); canvas.Translate(resizedFrame.Left, resizedFrame.Top); canvas.Scale(resizedFrame.Width / 260f, resizedFrame.Height / 260f); // Oval 2 canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet var oval2Rect = new SKRect(-116f, -116f, 116f, 116f); SKPath oval2Path = CacheForClock.oval2Path; oval2Path.Reset(); oval2Path.AddOval(oval2Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)rimColor; canvas.DrawPath(oval2Path, paint); canvas.Restore(); // Oval canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet var ovalRect = new SKRect(-110f, -110f, 110f, 110f); SKPath ovalPath = CacheForClock.ovalPath; ovalPath.Reset(); ovalPath.AddOval(ovalRect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)faceColor; canvas.DrawPath(ovalPath, paint); canvas.Restore(); // Text var textRect = new SKRect(118.48f, 34.85f, 142.5f, 53f); SKPath textPath = CacheForClock.textPath; textPath.Reset(); textPath.MoveTo(123.73f, 38.95f); textPath.LineTo(120.23f, 41.82f); textPath.LineTo(118.48f, 39.75f); textPath.LineTo(124f, 35.3f); textPath.LineTo(126.73f, 35.3f); textPath.LineTo(126.73f, 53f); textPath.LineTo(123.73f, 53f); textPath.LineTo(123.73f, 38.95f); textPath.Close(); textPath.MoveTo(130.73f, 50.25f); textPath.LineTo(137.55f, 43.55f); textPath.CubicTo(138.1f, 43.02f, 138.54f, 42.48f, 138.86f, 41.94f); textPath.CubicTo(139.19f, 41.4f, 139.35f, 40.78f, 139.35f, 40.07f); textPath.CubicTo(139.35f, 39.24f, 139.08f, 38.58f, 138.54f, 38.09f); textPath.CubicTo(138f, 37.6f, 137.33f, 37.35f, 136.53f, 37.35f); textPath.CubicTo(135.67f, 37.35f, 134.99f, 37.64f, 134.48f, 38.21f); textPath.CubicTo(133.96f, 38.79f, 133.64f, 39.51f, 133.53f, 40.38f); textPath.LineTo(130.6f, 39.92f); textPath.CubicTo(130.68f, 39.19f, 130.89f, 38.52f, 131.23f, 37.9f); textPath.CubicTo(131.56f, 37.28f, 131.98f, 36.75f, 132.5f, 36.3f); textPath.CubicTo(133.02f, 35.85f, 133.62f, 35.5f, 134.31f, 35.24f); textPath.CubicTo(135f, 34.98f, 135.76f, 34.85f, 136.57f, 34.85f); textPath.CubicTo(137.34f, 34.85f, 138.08f, 34.96f, 138.79f, 35.17f); textPath.CubicTo(139.5f, 35.39f, 140.12f, 35.72f, 140.68f, 36.16f); textPath.CubicTo(141.23f, 36.6f, 141.66f, 37.15f, 141.99f, 37.79f); textPath.CubicTo(142.31f, 38.43f, 142.48f, 39.17f, 142.48f, 40.03f); textPath.CubicTo(142.48f, 40.59f, 142.4f, 41.12f, 142.25f, 41.61f); textPath.CubicTo(142.1f, 42.1f, 141.9f, 42.57f, 141.64f, 43f); textPath.CubicTo(141.38f, 43.43f, 141.08f, 43.85f, 140.74f, 44.24f); textPath.CubicTo(140.4f, 44.63f, 140.03f, 45.01f, 139.63f, 45.38f); textPath.LineTo(134.53f, 50.25f); textPath.LineTo(142.5f, 50.25f); textPath.LineTo(142.5f, 53f); textPath.LineTo(130.73f, 53f); textPath.LineTo(130.73f, 50.25f); textPath.Close(); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)numbersColor; canvas.DrawPath(textPath, paint); // Bezier canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(-(minuteAngle + 90f)); // currentTransformation.peek().postRotate(-(minuteAngle + 90f)); // skipping - we do not support Matrix yet var bezierRect = new SKRect(-10f, -10f, 95f, 10f); SKPath bezierPath = CacheForClock.bezierPath; bezierPath.Reset(); bezierPath.MoveTo(7.07f, -7.07f); bezierPath.CubicTo(8.25f, -5.89f, 9.07f, -4.49f, 9.54f, -3f); bezierPath.LineTo(95f, -3f); bezierPath.LineTo(95f, 3f); bezierPath.LineTo(9.54f, 3f); bezierPath.CubicTo(9.07f, 4.49f, 8.25f, 5.89f, 7.07f, 7.07f); bezierPath.CubicTo(3.17f, 10.98f, -3.17f, 10.98f, -7.07f, 7.07f); bezierPath.CubicTo(-10.98f, 3.17f, -10.98f, -3.17f, -7.07f, -7.07f); bezierPath.CubicTo(-3.17f, -10.98f, 3.17f, -10.98f, 7.07f, -7.07f); bezierPath.Close(); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)darkHandsColor; canvas.DrawPath(bezierPath, paint); canvas.Restore(); // Bezier 2 canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(-(hourAngle + 90f)); // currentTransformation.peek().postRotate(-(hourAngle + 90f)); // skipping - we do not support Matrix yet var bezier2Rect = new SKRect(-10f, -10f, 56f, 10f); SKPath bezier2Path = CacheForClock.bezier2Path; bezier2Path.Reset(); bezier2Path.MoveTo(7.07f, -7.07f); bezier2Path.CubicTo(7.7f, -6.44f, 8.24f, -5.74f, 8.66f, -5f); bezier2Path.LineTo(56f, -5f); bezier2Path.LineTo(56f, 5f); bezier2Path.LineTo(8.66f, 5f); bezier2Path.CubicTo(8.24f, 5.74f, 7.7f, 6.44f, 7.07f, 7.07f); bezier2Path.CubicTo(3.17f, 10.98f, -3.17f, 10.98f, -7.07f, 7.07f); bezier2Path.CubicTo(-10.98f, 3.17f, -10.98f, -3.17f, -7.07f, -7.07f); bezier2Path.CubicTo(-3.17f, -10.98f, 3.17f, -10.98f, 7.07f, -7.07f); bezier2Path.Close(); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)darkHandsColor; canvas.DrawPath(bezier2Path, paint); canvas.Restore(); // Bezier 3 canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(-(secondsAngle + 90f)); // currentTransformation.peek().postRotate(-(secondsAngle + 90f)); // skipping - we do not support Matrix yet var bezier3Rect = new SKRect(-6f, -6f, 99f, 6f); SKPath bezier3Path = CacheForClock.bezier3Path; bezier3Path.Reset(); bezier3Path.MoveTo(4.24f, -4.24f); bezier3Path.CubicTo(5.16f, -3.33f, 5.72f, -2.19f, 5.92f, -1f); bezier3Path.LineTo(99f, -1f); bezier3Path.LineTo(99f, 1f); bezier3Path.LineTo(5.92f, 1f); bezier3Path.CubicTo(5.72f, 2.19f, 5.16f, 3.33f, 4.24f, 4.24f); bezier3Path.CubicTo(1.9f, 6.59f, -1.9f, 6.59f, -4.24f, 4.24f); bezier3Path.CubicTo(-6.59f, 1.9f, -6.59f, -1.9f, -4.24f, -4.24f); bezier3Path.CubicTo(-1.9f, -6.59f, 1.9f, -6.59f, 4.24f, -4.24f); bezier3Path.Close(); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)lightHandColor; canvas.DrawPath(bezier3Path, paint); canvas.Restore(); // Group { // Rectangle var rectangleRect = new SKRect(127f, 20f, 133f, 28f); SKPath rectanglePath = CacheForClock.rectanglePath; rectanglePath.Reset(); rectanglePath.AddRect(rectangleRect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectanglePath, paint); // Rectangle 2 var rectangle2Rect = new SKRect(127f, 232f, 133f, 240f); SKPath rectangle2Path = CacheForClock.rectangle2Path; rectangle2Path.Reset(); rectangle2Path.AddRect(rectangle2Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle2Path, paint); } // Group 2 { canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(90f); // currentTransformation.peek().postRotate(90f); // skipping - we do not support Matrix yet // Rectangle 3 var rectangle3Rect = new SKRect(-3f, -110f, 3f, -102f); SKPath rectangle3Path = CacheForClock.rectangle3Path; rectangle3Path.Reset(); rectangle3Path.AddRect(rectangle3Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle3Path, paint); // Rectangle 4 var rectangle4Rect = new SKRect(-3f, 102f, 3f, 110f); SKPath rectangle4Path = CacheForClock.rectangle4Path; rectangle4Path.Reset(); rectangle4Path.AddRect(rectangle4Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle4Path, paint); canvas.Restore(); } // Group 3 { canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(-30f); // currentTransformation.peek().postRotate(-30f); // skipping - we do not support Matrix yet // Rectangle 5 var rectangle5Rect = new SKRect(-3f, -110f, 3f, -102f); SKPath rectangle5Path = CacheForClock.rectangle5Path; rectangle5Path.Reset(); rectangle5Path.AddRect(rectangle5Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle5Path, paint); // Rectangle 6 var rectangle6Rect = new SKRect(-3f, 102f, 3f, 110f); SKPath rectangle6Path = CacheForClock.rectangle6Path; rectangle6Path.Reset(); rectangle6Path.AddRect(rectangle6Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle6Path, paint); canvas.Restore(); } // Group 4 { canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(-60f); // currentTransformation.peek().postRotate(-60f); // skipping - we do not support Matrix yet // Rectangle 7 var rectangle7Rect = new SKRect(-3f, -110f, 3f, -102f); SKPath rectangle7Path = CacheForClock.rectangle7Path; rectangle7Path.Reset(); rectangle7Path.AddRect(rectangle7Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle7Path, paint); // Rectangle 8 var rectangle8Rect = new SKRect(-3f, 102f, 3f, 110f); SKPath rectangle8Path = CacheForClock.rectangle8Path; rectangle8Path.Reset(); rectangle8Path.AddRect(rectangle8Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle8Path, paint); canvas.Restore(); } // Group 5 { canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(-120f); // currentTransformation.peek().postRotate(-120f); // skipping - we do not support Matrix yet // Rectangle 9 var rectangle9Rect = new SKRect(-3f, -110f, 3f, -102f); SKPath rectangle9Path = CacheForClock.rectangle9Path; rectangle9Path.Reset(); rectangle9Path.AddRect(rectangle9Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle9Path, paint); // Rectangle 10 var rectangle10Rect = new SKRect(-3f, 102f, 3f, 110f); SKPath rectangle10Path = CacheForClock.rectangle10Path; rectangle10Path.Reset(); rectangle10Path.AddRect(rectangle10Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle10Path, paint); canvas.Restore(); } // Group 6 { canvas.Save(); canvas.Translate(130f, 130f); // currentTransformation.peek().postTranslate(130f, 130f); // skipping - we do not support Matrix yet canvas.RotateDegrees(-150f); // currentTransformation.peek().postRotate(-150f); // skipping - we do not support Matrix yet // Rectangle 11 var rectangle11Rect = new SKRect(-3f, -110f, 3f, -102f); SKPath rectangle11Path = CacheForClock.rectangle11Path; rectangle11Path.Reset(); rectangle11Path.AddRect(rectangle11Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle11Path, paint); // Rectangle 12 var rectangle12Rect = new SKRect(-3f, 102f, 3f, 110f); SKPath rectangle12Path = CacheForClock.rectangle12Path; rectangle12Path.Reset(); rectangle12Path.AddRect(rectangle12Rect, SKPathDirection.Clockwise); paint.Reset(); paint.IsAntialias = true; paint.Style = SKPaintStyle.Fill; paint.Color = (SKColor)tickColor; canvas.DrawPath(rectangle12Path, paint); canvas.Restore(); } // Text 2 var text2Rect = new SKRect(111f, 198f, 149f, 238f); var text2TextPaint = CacheForClock.text2TextPaint; text2TextPaint.Reset(); text2TextPaint.IsAntialias = true; text2TextPaint.Color = (SKColor)numbersColor; text2TextPaint.Typeface = TypefaceManager.GetTypeface("Avenir Next.ttc"); text2TextPaint.TextSize = 25f; StaticLayout text2StaticLayout = CacheForClock.text2StaticLayout.get((int)text2Rect.Width, SKTextAlign.Center, "6", text2TextPaint); canvas.Save(); canvas.ClipRect(text2Rect); canvas.Translate(text2Rect.Left, text2Rect.Top + (text2Rect.Height - text2StaticLayout.getHeight()) / 2f); text2StaticLayout.draw(canvas); canvas.Restore(); // Text 3 var text3Rect = new SKRect(201f, 110f, 239f, 150f); var text3TextPaint = CacheForClock.text3TextPaint; text3TextPaint.Reset(); text3TextPaint.IsAntialias = true; text3TextPaint.Color = (SKColor)numbersColor; text3TextPaint.Typeface = TypefaceManager.GetTypeface("Avenir Next.ttc"); text3TextPaint.TextSize = 25f; StaticLayout text3StaticLayout = CacheForClock.text3StaticLayout.get((int)text3Rect.Width, SKTextAlign.Center, "3", text3TextPaint); canvas.Save(); canvas.ClipRect(text3Rect); canvas.Translate(text3Rect.Left, text3Rect.Top + (text3Rect.Height - text3StaticLayout.getHeight()) / 2f); text3StaticLayout.draw(canvas); canvas.Restore(); // Text 4 var text4Rect = new SKRect(22f, 110f, 60f, 150f); var text4TextPaint = CacheForClock.text4TextPaint; text4TextPaint.Reset(); text4TextPaint.IsAntialias = true; text4TextPaint.Color = (SKColor)numbersColor; text4TextPaint.Typeface = TypefaceManager.GetTypeface("Avenir Next.ttc"); text4TextPaint.TextSize = 25f; StaticLayout text4StaticLayout = CacheForClock.text4StaticLayout.get((int)text4Rect.Width, SKTextAlign.Center, "9", text4TextPaint); canvas.Save(); canvas.ClipRect(text4Rect); canvas.Translate(text4Rect.Left, text4Rect.Top + (text4Rect.Height - text4StaticLayout.getHeight()) / 2f); text4StaticLayout.draw(canvas); canvas.Restore(); // Text 13 var text13Rect = new SKRect(99f, 144f, 161f, 178f); var text13TextPaint = CacheForClock.text13TextPaint; text13TextPaint.Reset(); text13TextPaint.IsAntialias = true; text13TextPaint.Color = (SKColor)numbersColor; text13TextPaint.Typeface = TypefaceManager.GetTypeface("Avenir Next.ttc"); text13TextPaint.TextSize = 20f; StaticLayout text13StaticLayout = CacheForClock.text13StaticLayout.get((int)text13Rect.Width, SKTextAlign.Center, expression, text13TextPaint); canvas.Save(); canvas.ClipRect(text13Rect); canvas.Translate(text13Rect.Left, text13Rect.Top + (text13Rect.Height - text13StaticLayout.getHeight()) / 2f); text13StaticLayout.draw(canvas); canvas.Restore(); canvas.Restore(); }