1

我有一个 Xamarin Forms 应用程序,其中包含一个在 Android 项目Roboto-Regular.ttfAssets文件夹中调用的字体文件。它的 Build Action 设置为AndroidAsset.

使用SixLabors.FontsNuGet 包,我正在尝试加载此字体以将其用于水印。

但是,尝试使用资产流安装字体时,会抛出异常:

System.NotSupportedException:不支持指定的方法。

var fonts = new FontCollection();

FontFamily fontFamily;

using (var fontStream = Assets.Open("Roboto-Regular.ttf"))
{
    fontFamily = fonts.Install(fontStream); // Fails with "method not supported"
}

return fontFamily;

有什么想法可能导致这种情况,或者是否有更好的方法来加载字体以与SixLabors.ImageSharp包一起使用?

编辑:我尝试了 SushiHangover 的以下建议,但结果相同:

Xamarin 中的 Android 资产流

4

2 回答 2

0

似乎底层Stream没有LengthPosition属性(这解释了异常),所以现在我求助于转换为可搜索的MemoryStream

using (var assetStreamReader = new StreamReader(Assets.Open("Roboto-Regular.ttf"))
{   
    using (var ms = new MemoryStream())
    {
        assetStreamReader.BaseStream.CopyTo(ms);

        ms.Position = 0;

        var fontFamily = new FontCollection().Install(ms);
    }
}

查看FontReader实现,该错误现在更有意义:https ://github.com/SixLabors/Fonts/blob/master/src/SixLabors.Fonts/FontReader.cs

但是,我不确定为什么Assets不返回可搜索的流?

于 2018-09-19T12:33:58.003 回答
0

有两种Assets.Open方法,一种提供accessMode(C# Access 枚举标志集):

using (var fontStream = Assets.Open("Roboto-Regular.ttf", Android.Content.Res.Access.Random))
{
    fontFamily = fonts.Install(fontStream); 
}

回复:https://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String,%20int)

public enum Access
{
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_BUFFER")]
    Buffer = 3,
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_RANDOM")]
    Random = 1,
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_STREAMING")]
    Streaming,
    [IntDefinition (null, JniField = "android/content/res/AssetManager.ACCESS_UNKNOWN")]
    Unknown = 0
}
于 2018-09-19T16:07:45.133 回答