在SkiaSharp中加载字体

6
如何在Xamarin Forms中使用自定义字体的Skiasharp。
我尝试了:
paint.Typeface = SKTypeface.FromFamilyName("CoText_Bd"); 

and

paint.Typeface = SKTypeface.FromFile("CoText_Bd");

但是两者都没有起作用。我需要使用依赖服务来访问字体路径吗?
2个回答

12

如果您希望获得真正的跨平台解决方案,请将所有SkiaSharp/PaintCode绘图代码放入.NET标准库中,包括字体作为嵌入式资源(别忘了将Build操作设置为嵌入式资源!)。然后,您可以使用此方法(Library ClassLibrary1,文件夹Font)获取SKTypeface对象:

    public static SKTypeface GetTypeface(string fullFontName)
    {
        SKTypeface result;

        var assembly = Assembly.GetExecutingAssembly();
        var stream = assembly.GetManifestResourceStream("ClassLibrary1.Font." + fullFontName);
        if (stream == null)
            return null;

        result = SKTypeface.FromStream(stream);
        return result;
    }

在不需要 SKObjects 时,请记得将其处理掉。

为了优化性能,可以将 SKTypeface 对象缓存到 Dictionary 中以提高速度。

当您将所有绘图代码放入 .NET 标准库中时,您可以轻松地在 Windows Desktop WPF 项目中进行测试/开发,享受快速的编译和构建,并在准备就绪时将其用于移动应用程序。


使用本地资源管理有其原因:嵌入式资源会使程序集变得臃肿,并可能导致加载时间变长。此外,本地资源可以由操作系统进行本地化或优化。 - Matthew
1
我明白你的意思,但是拥有开箱即用的多平台功能也很不错。而且字体没有本地化,通过良好的管理只需加载一次。但是有一些方法的基准测试会很好 - 应用程序大小+启动速度。 - Michal Dobrodenka

1
我们应该在 iOS 的 info.plist 中添加 UIAppFonts。
<key>UIAppFonts</key>
<array>
    <string>CoText_Bd.otf</string>
</array>

对于Android,请尝试

CoText_Bd.otf#CoText_Bd

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