将当前平台字体传递到SKTypeface中?

8
当尝试呈现中文(或其他象征性)文本时,SkiSharp会呈现方框而不是正确的中文字符。显然,Skia默认使用的字体不支持这些字符。因此,我们必须使用支持这些字符的字体来分配自己的SKTypeface。
我的初始策略只是包含呈现这些字符所需的字体,这也可以正常工作。但是,当支持多个具有自己字体的不同象征性语言时,应用程序的大小急剧增长(大约每个字体15 mb)。
所以再考虑一下...默认平台字体似乎完全支持任何这些象征性字符。我的意思是,默认使用的字体可以完美地呈现按钮、标签和标题。
所以我目前的想法是,为什么我不能将任何字体传递给我的控件中的SKTypeface? 问题在于,我不知道如何获得任何后备或默认字体,以便使用它创建新的SKTypeface。 我的问题: 如何从呈现这些按钮、标签和标题的相同字体中创建SKTypeface?
注:如果您需要我提供任何帮助来理解或解决问题,请告诉我。

1
请随意点踩,只要让我知道您的想法,以便我改进我的问题。 - Dan Beaulieu
1个回答

10

您应该能够使用SKFontManager.MatchCharacter或其重载之一来执行以下操作:

使用系统回退查找给定字符的字体。

下面是一个基于SkiaSharp WindowsSample的TextSample的示例:

public class TextSample : SampleBase
{
    // ...
    protected override void OnDrawSample(SKCanvas canvas, int width, int height)
    {
        canvas.DrawColor(SKColors.White);
        const string text = "象形字";
        var x = width / 2f;
        // in my case the line below returns typeface with FamilyName `Yu Gothic UI`
        var typeface = SKFontManager.Default.MatchCharacter(text[0]);
        using (var paint = new SKPaint())
        {
            paint.TextSize = 64.0f;
            paint.IsAntialias = true;
            paint.Color = (SKColor)0xFF4281A4;
            paint.IsStroke = false;
            paint.Typeface = typeface; // use typeface for the first one
            paint.TextAlign = SKTextAlign.Center;

            canvas.DrawText(text, x, 64.0f, paint);
        }

        using (var paint = new SKPaint())
        {
            // no typeface here
            paint.TextSize = 64.0f;
            paint.IsAntialias = true;
            paint.Color = (SKColor)0xFF9CAFB7;
            paint.IsStroke = true;
            paint.StrokeWidth = 3;
            paint.TextAlign = SKTextAlign.Center;

            canvas.DrawText(text, x, 144.0f, paint);
        }
    }
}

下面是输出结果

示例输出


3
你不知道这节省了我多少工作量,谢谢! - Dan Beaulieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接