From 4b7b1aa029a01d8a86bb19e214a6e8ea8d3c30ab Mon Sep 17 00:00:00 2001 From: marcchevaldonne Date: Thu, 4 Apr 2024 15:20:50 +0200 Subject: [PATCH] :sparkles: update last two samples --- .../ex_OutlineText/MainPage.xaml | 83 +++++++++++++++++- .../ex_OutlineText/MainPage.xaml.cs | 35 -------- .../ex_OutlineText/MauiProgram.cs | 1 + .../Fonts/Friendfship Magic - Equestria.ttf | Bin 0 -> 27352 bytes .../ex_OutlineText/Views/LabelOutline.xaml | 7 +- .../ex_OutlineText/Views/LabelOutline.xaml.cs | 76 +++++++++++++++- .../ex_ShadowLabel/MainPage.xaml | 10 +-- .../ex_ShadowLabel/ex_ShadowLabel.csproj | 6 +- 8 files changed, 165 insertions(+), 53 deletions(-) create mode 100755 ch02_DesigningViews/ex_OutlineText/Resources/Fonts/Friendfship Magic - Equestria.ttf diff --git a/ch02_DesigningViews/ex_OutlineText/MainPage.xaml b/ch02_DesigningViews/ex_OutlineText/MainPage.xaml index d3f808d..71895cb 100644 --- a/ch02_DesigningViews/ex_OutlineText/MainPage.xaml +++ b/ch02_DesigningViews/ex_OutlineText/MainPage.xaml @@ -6,14 +6,89 @@ + Padding="4,0" + Spacing="10"> + - diff --git a/ch02_DesigningViews/ex_OutlineText/MainPage.xaml.cs b/ch02_DesigningViews/ex_OutlineText/MainPage.xaml.cs index 2e740b0..b90d1da 100644 --- a/ch02_DesigningViews/ex_OutlineText/MainPage.xaml.cs +++ b/ch02_DesigningViews/ex_OutlineText/MainPage.xaml.cs @@ -9,40 +9,5 @@ public partial class MainPage : ContentPage { InitializeComponent(); } - - private void OnPainting(object sender, SKPaintSurfaceEventArgs args) - { - SKImageInfo info = args.Info; - SKSurface surface = args.Surface; - SKCanvas canvas = surface.Canvas; - - canvas.Clear(); - - string text = "OUTLINE"; - - // Create an SKPaint object to display the text - SKPaint textPaint = new SKPaint - { - Style = SKPaintStyle.Stroke, - StrokeWidth = 1, - FakeBoldText = true, - Color = SKColors.Blue - }; - - // 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); - } } diff --git a/ch02_DesigningViews/ex_OutlineText/MauiProgram.cs b/ch02_DesigningViews/ex_OutlineText/MauiProgram.cs index 51e8c8d..f60ad3b 100644 --- a/ch02_DesigningViews/ex_OutlineText/MauiProgram.cs +++ b/ch02_DesigningViews/ex_OutlineText/MauiProgram.cs @@ -15,6 +15,7 @@ public static class MauiProgram { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); + fonts.AddFont("Friendfship Magic - Equestria.ttf", "FriendfshipMagicEquestria"); }); #if DEBUG diff --git a/ch02_DesigningViews/ex_OutlineText/Resources/Fonts/Friendfship Magic - Equestria.ttf b/ch02_DesigningViews/ex_OutlineText/Resources/Fonts/Friendfship Magic - Equestria.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a1250aef48ec39120775f2f4bcd474dd017198de GIT binary patch literal 27352 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 + x:Class="ex_OutlineText.Views.LabelOutline" + x:Name="root"> + HeightRequest="{Binding ActualHeight, x:Reference=root}" + WidthRequest="{Binding ActualWidth, x:Reference=root}"/> diff --git a/ch02_DesigningViews/ex_OutlineText/Views/LabelOutline.xaml.cs b/ch02_DesigningViews/ex_OutlineText/Views/LabelOutline.xaml.cs index d36edac..b7a8d88 100644 --- a/ch02_DesigningViews/ex_OutlineText/Views/LabelOutline.xaml.cs +++ b/ch02_DesigningViews/ex_OutlineText/Views/LabelOutline.xaml.cs @@ -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(); diff --git a/ch02_DesigningViews/ex_ShadowLabel/MainPage.xaml b/ch02_DesigningViews/ex_ShadowLabel/MainPage.xaml index e56dcbd..c023857 100644 --- a/ch02_DesigningViews/ex_ShadowLabel/MainPage.xaml +++ b/ch02_DesigningViews/ex_ShadowLabel/MainPage.xaml @@ -6,17 +6,17 @@ + Spacing="25" + BackgroundColor="LightSalmon">