我正在使用Xamarin为多个平台开发应用程序。共享代码托管在单独的PCL项目中。该项目包含大量图像,我也想通过PCL项目分享。
这可能吗?如何从特定于平台的项目中访问图像数据?
答案 0 :(得分:2)
您应该将图像放在每个单独的项目中,因为每个平台都有不同的图像分辨率约定,并且为了优化和正确显示图像,您需要使用特定于操作系统的约定将图像保存在不同的项目中。
您可以在PCL项目中引用图像文件,如下所示:
beachImage.Source = "waterfront.png";
通过以下约定在每个OS项目中定义海滨:
Android图片应放在Resources \ Drawable \ {specificResolution}
中Android具有以下解决方案(取自Android developer site):
ldpi (low) ~120dpi mdpi (medium) ~160dpi hdpi (high) ~240dpi xhdpi (extra-high) ~320dpi xxhdpi (extra-extra-high) ~480dpi xxxhdpi (extra-extra-extra-high) ~640dpi
请注意,每个分辨率都有自己的图像文件夹。
在iOS中你有这些决议(取自iOS Human Interface Guidelines ):
您应该在Resources文件夹中添加“@ 2x”或“@ 3x”来分隔图像。
答案 1 :(得分:0)
PCL支持的ResourceManager
类仅支持一组有限的数据类型,而图像不是其中之一。
根据the MSDN article here,处理图像数据类型的最佳方法是将图像编码为Base64编码的字符串资源,然后将数据解码为ByteArray
,然后将该字节数组加载到Image中
您必须预先处理图像以生成Base64字符串,因为这不能在运行时完成。
答案 2 :(得分:0)
我最终做了什么(直到现在,我只能在iOS和Droid项目上验证,Windows Phone仍在开发中):
我将共享项目中的图像数据作为Stream
返回,如:
public Stream GetImageStream () {
return assembly.GetManifestResourceStream (nameOfResource);
}
图片的属性设置为EmbeddedResource
。在我的iOS项目中,我可以像这样访问我的图像:
using (var stream = myClass.GetImageStream ()) {
var image = new UIImage (NSData.FromStream (stream));
// do stuff with image
}
在Android上我使用以下代码:
using (var stream = myClass.GetImageStream ()) {
var bitmap = BitmapFactory.DecodeStream (stream);
// do stuff with bitmap
}
反馈是否有任何关于这种做法的问题是受欢迎的! (除了明显的大小问题,我现在可以忍受,我可以想象这种方法绕过任何特定于平台的缓存机制?)