Xamarin原生应用+ PCL:在PCL项目中共享图像

时间:2015-04-16 12:59:47

标签: c# xamarin portable-class-library

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

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

3 个答案:

答案 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 ): iOS Resolutions

您应该在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
}

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

相关问题