using System.Diagnostics; using SkiaSharp; using SkiaSharp.Views.Maui; namespace ex_OutlineText.Views; public partial class LabelOutline : ContentView { public LabelOutline() { InitializeComponent(); } public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(LabelOutline), "something"); public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } } public static readonly BindableProperty FillProperty = BindableProperty.Create(nameof(Fill), typeof(Color), typeof(LabelOutline), Colors.DarkSalmon); public Color Fill { get { return (Color)GetValue(FillProperty); } set { SetValue(FillProperty, value); } } public static readonly BindableProperty StrokeProperty = BindableProperty.Create(nameof(Stroke), typeof(Color), typeof(LabelOutline), Colors.DarkSalmon); public Color Stroke { get { return (Color)GetValue(StrokeProperty); } set { SetValue(StrokeProperty, value); } } public static readonly BindableProperty StrokeWidthProperty = BindableProperty.Create(nameof(StrokeWidth), typeof(float), typeof(LabelOutline), 1.0f); public float StrokeWidth { get { return (float)GetValue(StrokeWidthProperty); } set { SetValue(StrokeWidthProperty, value); } } public static readonly BindableProperty FontFamilyProperty = BindableProperty.Create(nameof(FontFamily), typeof(string), typeof(LabelOutline), "something"); public string FontFamily { get { return (string)GetValue(FontFamilyProperty); } set { SetValue(FontFamilyProperty, value); } } public static readonly BindableProperty TextSizeProperty = BindableProperty.Create(nameof(TextSize), typeof(float), typeof(LabelOutline), 24.0f); public float TextSize { get { return (float)GetValue(TextSizeProperty); } set { SetValue(TextSizeProperty, value); } } public static readonly BindableProperty AspectProperty = BindableProperty.Create(nameof(Aspect), typeof(Aspect), typeof(LabelOutline), Aspect.Center); public Aspect Aspect { get { return (Aspect)GetValue(AspectProperty); } set { SetValue(AspectProperty, value); } } public static readonly BindableProperty RatioProperty = BindableProperty.Create(nameof(Ratio), typeof(float), typeof(LabelOutline), 0.95f); public float Ratio { get { return (float)GetValue(RatioProperty); } set { SetValue(RatioProperty, value); } } private void OnPainting(object sender, SKPaintSurfaceEventArgs args) { SKImageInfo info = args.Info; SKSurface surface = args.Surface; SKCanvas canvas = surface.Canvas; canvas.Clear(); string text = Text; // Create an SKPaint object to display the text SKPaint textPaint = new SKPaint { Style = SKPaintStyle.Fill, StrokeWidth = StrokeWidth, FakeBoldText = true, Typeface = SKTypeface.FromFamilyName(FontFamily), Color = Fill.ToSKColor(), TextSize = TextSize }; switch(Aspect) { case Aspect.AspectFit: float textHeight = Ratio * info.Height; float textWidth2 = textPaint.MeasureText(text); textWidth2 = Ratio * info.Width * textPaint.TextSize / textWidth2; textPaint.TextSize = Math.Min(textHeight, textWidth2); Console.WriteLine($"info.Width: {info.Width} ; info.Height: {info.Height} ; textPaint.TextSize: {textPaint.TextSize} ; textHeight: {textHeight} ; textWidth: {textWidth2}"); break; case Aspect.AspectFill: case Aspect.Fill: float textWidth = textPaint.MeasureText(text); textPaint.TextSize = Ratio * info.Width * textPaint.TextSize / textWidth; Console.WriteLine($"info.Width: {info.Width} ; info.Height: {info.Height} ; textPaint.TextSize: {textPaint.TextSize}"); break; case Aspect.Center: default: break; } // Adjust TextSize property so text is 95% of screen width // float textWidth = textPaint.MeasureText(text); // textPaint.TextSize = 0.95f * info.Width * textPaint.TextSize / textWidth; // Find the text bounds SKRect textBounds = new SKRect(); textPaint.MeasureText(text, ref textBounds); // Calculate offsets to center the text on the screen float xText = info.Width / 2 - textBounds.MidX; float yText = info.Height / 2 - textBounds.MidY; // And draw the text canvas.DrawText(text, xText, yText, textPaint); textPaint.Style = SKPaintStyle.Stroke; textPaint.Color = Stroke.ToSKColor(); canvas.DrawText(text, xText, yText, textPaint); } }