[英]Xamarin native apps + PCL: Share images in PCL project
我正在使用Xamarin开发适用于多个平台的应用程序。 共享代码托管在单独的PCL项目中。 该项目包含大量图像,我也想通过PCL项目共享这些图像。
那可能吗? 如何从特定于平台的项目中访问图像数据?
您应该将图像放在每个单独的项目中,因为每个平台具有不同的图像分辨率约定,并且为了优化和正确显示图像,您需要使用操作系统特定的约定将图像保存在不同的项目中。
您可以像这样在PCL项目中引用图像文件:
beachImage.Source = "waterfront.png";
在每个OS项目中按照以下约定定义了滨水区:
Android图片应放置在Resources \\ Drawable \\ {specificResolution}中
Android具有以下解决方案(来自Android开发者网站 ):
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 ):
您应该通过在“资源”文件夹中添加“ @ 2x”或“ @ 3x”来分离图像。
PCL支持的ResourceManager
类仅支持一组有限的数据类型,而Image不是其中之一。
根据此处的MSDN文章 ,处理图像数据类型的最佳方法是将图像编码为Base64编码的字符串资源,然后将数据解码为ByteArray
,然后将该字节数组加载到Image中。
您将不得不预处理图像以生成Base64字符串,因为在运行时无法完成。
我终于做了什么(到现在为止,我只能在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
}
欢迎反馈是否有这种做法的陷阱! (除了我现在可以使用的明显的大小调整问题之外,我还可以想象这种方法绕过了任何特定于平台的缓存机制吗?)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.