【问题标题】:Loading a font in skiasharp在skiasharp中加载字体
【发布时间】:2018-11-02 19:45:08
【问题描述】:

如何在 Xamarin 表单的skiasharp 中使用自定义字体。

我试过了

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

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

但两者都没有成功。 我需要使用依赖服务访问字体的路径吗?

【问题讨论】:

    标签: xamarin xamarin.forms xamarin.ios xamarin.android skiasharp


    【解决方案1】:

    如果您想要真正的多平台解决方案,请将所有 SkiaSharp/PaintCode 绘图代码放入 .NET 标准库中,包括作为嵌入资源的字体(不要忘记将构建操作设置为嵌入资源!)。然后就可以使用这个方法获取SKTypeface对象了(Library ClassLibrary1, Folder Font):

        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 对象以优化速度。

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

    【讨论】:

    • 使用本机资源管理是有原因的:嵌入式资源会使程序集膨胀并可能使加载时间变长。此外,本机资源可以由操作系统本地化或优化。
    • 我明白了,但开箱即用的多平台也不错。而且字体没有本地化,并且通过良好的管理,它们只加载一次。但是有一些方法的基准会很好 - 应用程序大小 + 启动速度。
    【解决方案2】:

    我们应该在 iOS 的 info.plist 中添加 UIAppFonts

    <key>UIAppFonts</key>
    <array>
        <string>CoText_Bd.otf</string>
    </array>
    

    安卓试试

    CoText_Bd.otf#CoText_Bd
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2012-04-27
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      相关资源
      最近更新 更多