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

标签 android xamarin xamarin.forms xamarin.android skiasharp

我正在 native xamarin andorid 中工作。我面临设置自定义字体的问题。我正在使用“SkiaSharp”插件来生成 Canvas View 。该插件位于 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 作为返回值。

我认为找不到字体路径。

bool flag=File.Exist(FontPath)

它总是返回空值。

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

最佳答案

您通常不会使用 Android 资源的路径,因为它们位于应用程序包内。相反,您获取一个流并加载它 - 但是 Assets 流不可查找,因此必须首先复制它们:

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;

我还想指出,这相对“慢”,因此您可能只想执行一次,然后重新使用字体。避免直接在绘制方法中加载文件,因为绘制发生在 UI 线程上并且会阻塞。

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

编辑

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

关于android - 如何从资源文件夹获取字体文件的路径以及如何使用该路径在xamarin android中设置SKTypeface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46538300/

相关文章:

javascript - 在断开连接的状态下运行 jquery 移动网络应用程序?

android - 在 firebase 上进行电话身份验证时出错

c# - Xamarin.Forms - Webview(带有本地文件)在 Windows Phone 8.1 和 10 上不工作

android - 数据库插入后 ListView 不更新

android - 理论上在游戏中使用 fontawesome(图标)

mono - 从 Xamarin Mono for Android 项目引用 PCL(可移植类库)

c# - Xamarin、MySQL 异常 : unable to connect to any specific host

listview - 在 ListView Xamarin 表单中滚动时图像消失

c# - Xamarin 页面 c# 中的自定义事件

c# - 更快地插入sqlite3处理