Xamarin 本机应用程序 + PCL:在 PCL 项目中共享图像

Xamarin native apps + PCL: Share images in PCL project

我正在使用 Xamarin 为多个平台开发应用程序。共享代码托管在单独的 PCL 项目中。该项目包含大量图片,我也想通过 PCL 项目分享。

这可能吗?如何从我的平台特定项目访问图像数据?

PCL支持的ResourceManagerclass只支持有限的一组数据类型,图像不是其中之一。

根据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
}

欢迎反馈此做法是否有任何问题! (除了我现在可以忍受的明显的大小问题之外,我可以想象这种方法绕过了任何特定于平台的缓存机制?)