Xamarin 本机应用程序 + PCL:在 PCL 项目中共享图像
Xamarin native apps + PCL: Share images in PCL project
我正在使用 Xamarin 为多个平台开发应用程序。共享代码托管在单独的 PCL 项目中。该项目包含大量图片,我也想通过 PCL 项目分享。
这可能吗?如何从我的平台特定项目访问图像数据?
PCL支持的ResourceManager
class只支持有限的一组数据类型,图像不是其中之一。
根据the MSDN article here,处理图像数据类型的最佳方法是将图像编码为 Base64 编码字符串资源,然后将数据解码为 ByteArray
,然后将该字节数组加载到图片。
您必须对图像进行预处理以生成 Base64 字符串,因为这无法在运行时完成。
你应该把你的图片放在每个单独的项目中,因为每个平台有不同的图像分辨率约定,为了优化和正确显示图像,你需要将图像保存在不同的项目中 OS 具体约定。
您可以像这样引用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 ):
您应该通过在资源文件夹中添加“@2x”或“@3x”来分隔图像。
我最终做了什么(到现在为止,我只能在iOS和Droid项目上验证,Windows Phone还在工作中):
我 return 来自我共享项目的图像数据 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
}
欢迎反馈此做法是否有任何问题! (除了我现在可以忍受的明显的大小问题之外,我可以想象这种方法绕过了任何特定于平台的缓存机制?)
我正在使用 Xamarin 为多个平台开发应用程序。共享代码托管在单独的 PCL 项目中。该项目包含大量图片,我也想通过 PCL 项目分享。
这可能吗?如何从我的平台特定项目访问图像数据?
PCL支持的ResourceManager
class只支持有限的一组数据类型,图像不是其中之一。
根据the MSDN article here,处理图像数据类型的最佳方法是将图像编码为 Base64 编码字符串资源,然后将数据解码为 ByteArray
,然后将该字节数组加载到图片。
您必须对图像进行预处理以生成 Base64 字符串,因为这无法在运行时完成。
你应该把你的图片放在每个单独的项目中,因为每个平台有不同的图像分辨率约定,为了优化和正确显示图像,你需要将图像保存在不同的项目中 OS 具体约定。
您可以像这样引用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 ):
您应该通过在资源文件夹中添加“@2x”或“@3x”来分隔图像。
我最终做了什么(到现在为止,我只能在iOS和Droid项目上验证,Windows Phone还在工作中):
我 return 来自我共享项目的图像数据 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
}
欢迎反馈此做法是否有任何问题! (除了我现在可以忍受的明显的大小问题之外,我可以想象这种方法绕过了任何特定于平台的缓存机制?)