|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using SkiaSharp;
|
|
|
|
|
using SkiaSharp.Views.Maui;
|
|
|
|
|
|
|
|
|
@ -58,6 +59,54 @@ public partial class LabelOutline : ContentView
|
|
|
|
|
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;
|
|
|
|
@ -74,12 +123,33 @@ public partial class LabelOutline : ContentView
|
|
|
|
|
Style = SKPaintStyle.Fill,
|
|
|
|
|
StrokeWidth = StrokeWidth,
|
|
|
|
|
FakeBoldText = true,
|
|
|
|
|
Color = Fill.ToSKColor()
|
|
|
|
|
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;
|
|
|
|
|
// float textWidth = textPaint.MeasureText(text);
|
|
|
|
|
// textPaint.TextSize = 0.95f * info.Width * textPaint.TextSize / textWidth;
|
|
|
|
|
|
|
|
|
|
// Find the text bounds
|
|
|
|
|
SKRect textBounds = new SKRect();
|
|
|
|
|