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

时间:2017-10-03 06:22:51

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

我在原生的xamarin andorid工作。我面临着设置自定义字体的问题。我正在使用" SkiaSharp"插件生成画布视图。该插件位于PCL内部,因此可以在android和ios中使用。

我的"资产"中有一个.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 tf = Typeface.CreateFromAsset(Assets, "Myfile.ttf");

我总是将null SKTypeface作为返回值。

我认为找不到字体路径。

bool flag=File.Exist(FontPath)

它总是返回null值。

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

1 个答案:

答案 0 :(得分:3)

您通常不会使用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;

我还要注意这是相对“慢”的,所以你可能想要这样做一次,然后重新使用字体。避免直接在paint方法中加载文件,因为绘制在UI线程上发生并将阻止。

加载资源时,请不要包含根“Assets”文件夹,因为这是假设的。

修改

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