我有一个Xamarin Forms应用程序,其中在Android项目的 Assets 文件夹中包含了一个名为transactions: [{
item_list: {
items: [...categoryItem, ...ordersItems]
},
amount: {
currency: 'INR',
total: reg.totalBill
}
}]
的字体文件。其构建操作设置为Roboto-Regular.ttf
。
我使用AndroidAsset
NuGet包,尝试加载该字体以将其用于水印。
但是,尝试使用资产流安装字体时,抛出异常:
System.NotSupportedException:不支持指定的方法。
SixLabors.Fonts
有什么想法会导致这种情况,或者是否有更好的方法来加载字体以供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;
包使用?
编辑:我尝试了以下SushiHangover的建议,但产生的结果相同:
答案 0 :(得分:0)
似乎底层的Stream
没有Length
或Position
属性(这解释了例外情况),所以现在我改为采用可搜索的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
为什么不返回可搜索的流吗?
答案 1 :(得分:0)
有两种Assets.Open
方法,一种提供了accessMode
(设置了C#Access枚举标志):
using (var fontStream = Assets.Open("Roboto-Regular.ttf", Android.Content.Res.Access.Random))
{
fontFamily = fonts.Install(fontStream);
}
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
}