如何从资产文件夹中获取字体文件的路径以及如何使用该路径在 xamarin android 中设置 SKTypeface?

How to get path of font file from asset folder and how to use that path to set SKTypeface in xamarin android?

我在原生 xamarin andorid 中工作。我在设置自定义字体时遇到问题。我正在使用 "SkiaSharp" 插件生成 canvas 视图。该插件位于 PCL 中,因此可以在 android 和 ios 中使用。

我的 "Assets" 文件夹中有一个 .ttf 文件。

我使用以下代码生成字体路径。

string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
string FontPath = System.IO.Path.Combine(path, "Myfile.ttf");

这条路径我发送到PCL设置"SKTypeface"

paint.Typeface = SKTypeface.FromFile(FontPath, 0);

如果是"Typeface"那么我可以使用下面的方法

Typeface tf = Typeface.CreateFromAsset(Assets, "Myfile.ttf");

我总是得到 null SKTypeface 作为 return 值。

我认为找不到字体路径。

bool flag=File.Exist(FontPath)

它总是 return 空值。

如何获取xamarin andorid中Asset文件夹的路径? 如何设置自定义字体为SKTypeface?

您通常不会使用 android 资产的路径,因为它们位于应用包内。相反,你得到一个流并加载它——但是资产流是不可搜索的,所以必须先复制它们:

SKTypeface typeface;
using (var asset = Assets.Open("Fonts/CONSOLA.TTF"))
{
    var fontStream = new MemoryStream();
    asset.CopyTo(fontStream);
    fontStream.Flush();
    fontStream.Position = 0;
    typeface = SKTypeface.FromStream(fontStream);
}

...
paint.Typeface = typeface;

我还想说明一下,这是相对的 "slow",因此您可能想这样做一次,然后重新使用该字体。避免直接在绘制方法中加载文件,因为绘制发生在 UI 线程上并且会阻塞。

加载资产时,不包括根 "Assets" 文件夹,因为这是假定的。

编辑

在新的 v1.59.2 版本中,现有的 FromStream 方法将按预期工作,与流无关。