2015-04-16 47 views
1

我正在爲使用Xamarin的多個平臺開發應用程序。共享代碼託管在一個單獨的PCL項目中。該項目包含大量圖像集,我也希望通過PCL項目分享。Xamarin原生應用程序+ PCL:在PCL項目中共享圖像

這可能嗎?我如何從我的平臺特定項目訪問圖像數據?

+1

你當然可以。即使您使用的是本機端,您仍然可以使用xamarin表單庫(查看http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/images/#Embedded_Images ) – Johan

回答

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 
} 

反饋是否歡迎這種做法任何陷阱! (除了明顯的大小問題,我現在可以忍受,我可以想象這種方法繞過了任何特定於平臺的緩存機制?)

0

PCL支持的ResourceManager類只支持一組有限的數據類型,而圖像不是其中之一。

根據the MSDN article here,處理圖像數據類型的最佳方法是將圖像編碼爲Base64編碼的字符串資源,然後將數據解碼爲ByteArray,然後將該字節數組加載到圖像中。

您將不得不預先處理圖像以生成Base64字符串,因爲這無法在運行時完成。

+0

謝謝。但是,不得不爲每千幅圖像執行base64編碼聽起來不太吸引人。我現在爲了一個不同的解決方案(它適用於iOS應用程序,但沒有嘗試過其他平臺),我將發佈一個單獨的答案。 – qqilihq

2

您應該將圖片放在每個單獨的項目中,因爲每個平臺都有不同的圖片分辨率約定,爲了優化和正確顯示圖片,您需要將圖片保存在不同的項目中。

您可以參考的圖像文件中的PCL項目是這樣的:

beachImage.Source = "waterfront.png";這裏的海濱,在每個OS項目由以下約定定義:

Android的影像應放置在資源\繪製對象\ { 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

你應該在你的資源文件夾添加一個「@ 2X」或「@ 3X」分離圖像。

+0

在當前的發展階段,這只是不能爲數以千計的圖像擴展。這就是爲什麼我現在想爲每個平臺/解決方案提供一張圖片的原因。但是,我們很可能會在稍後對其進行優化。 – qqilihq