2015-05-12 16 views
0

我正在創建一個android應用程序。但是,支持多個屏幕似乎是應用程序開發中的一個問題。我看到Android支持多屏幕的方式是提供不同大小的圖標/徽標的重複。但是,我認爲這是一個不適當的解決方案,並且相信必須有更好的方法。在運行時縮放圖標/徽標以支持多個屏幕 - Android

我將我的圖標/徽標存儲在服務器上的文件夾中。這些圖像將由1024個1024個圖像組成。我希望能夠從服務器檢索徽標/圖標,並在運行時將圖像縮放到受支持的屏幕。我知道必須有辦法做到這一點。

解決方案?

+1

它應該真的只是在默認情況下工作。如果你有一個imageview,只需在layout xml中設置它的大小,當你設置imageview的imageview時,它應該將圖像縮放到imageview的大小 –

+0

這是什麼對你有用,即屏幕尺寸之間的質量和一致性? – cg14

+0

是的。我從來沒有這樣做的問題。 –

回答

0

我總是縮放我的位圖,這取決於我繪製的SurfaceView的寬度和高度。 Bitmap類有一些方法來提供這樣的功能。

您可以將圖像加載到位圖中,然後對其進行縮放,也可以使用Bitmap.Options並直接從所需大小的資源中加載!

檢查的位圖,BitmapFactory,SurfaceView和Canvas API的

這裏是我的應用程序之一的例子:

playTable.dotSymbol=Bitmap.createScaledBitmap(origDotBitmap,playTable.symbolSize,playTable.symbolSize,true); 

這只是我從一個給定的位圖我之前已加載縮放圖標:

origDotBitmap=BitmapFactory.decodeResource(res,R.drawable.dotobject); 

另外:提防內存溢出異常的......在我的筆記4我可以OOM

0之前裝載的1024×1024尺寸的28點左右的位圖
+0

在使用Bitmap.createScaledBitmap方法時,調整大小後圖像的質量如何?另外,關於OutOfMemoryException的提示。由於您將圖像存儲在可繪製文件夾中或從遠程源下載,是否出現此異常? – cg14

+0

它是當你加載太麻煩的位圖到內存中,所以它流過...你可以在你的apk中存儲高達2 GB的內容,當你在內存中加載過多時,它只會歸結爲OOM。質量取決於您要縮放的位圖的原始大小...將位圖加載到內存中並在危險之後調整大小...它更好地直接加載選項,以便您可以提供5000x5000像素圖像並將其加載最小的損失和混淆到你想要的尺寸......但是圖像越大,加載它所花費的時間越多! –

+0

當你下載它,你必須首先將圖像存儲在你的內存中,所以我會在圖像後加載圖像,然後調整它們的大小,然後調用GC並加載下一個。 –

0

遵循所描述的在桶(ldpi,mdpi,hdpi,tvdpi,xhdpi,xxhdpi,xxxhdpi等)中提供多個圖像的範例可能是最安全和最簡單的賭注。

但是,僅爲某些存儲桶提供可繪圖,比方說只針對xxhdpi,將爲其他非xxhdpi設備執行訣竅並重新縮放圖像。但請注意,不能保證圖像的顯示方式與預期完全相同。

考慮從網絡中拉出圖像並重新縮放圖像的解決方案(假設基於計算出的屏幕寬度),請考慮以下潛在問題:1.所提供圖像的質量是否能保證在超大尺寸設備? 2.從網絡拉圖像是一個昂貴的調用,不應該在主線程上運行,所以你必須異步拉動它們。 3.據我所知,屏幕的確切寬度只有在佈局放置在屏幕上,因此,您必須觀察OnGlobalLayoutListener。這與從網絡中提取圖像的異步請求相結合,可能會造成您必須處理的競爭條件。

問題2通過使用Volley的ImageLoader和NetworkImageView(https://developer.android.com/training/volley/request.html)或任何其他類似的庫,3可以有所簡化。

+0

排氣似乎是一個非常有用的工具。如果不是這個特定的項目,那麼在未來。在查看你的鏈接後,它似乎像排除了http請求(除了提供url)外的抽象摘要。它是否正確? – cg14

+0

是的,除了URL之外,您唯一需要提供的是ImageLoader對象,它也可以處理緩存。 因此,一個典型的用法如下所示: String url =「http://somepic.png」 NetworkImageView mNetworkImageView =(NetworkImageView)findViewById(R.id.someimage);mNetworkImageView.setImageUrl(url,mImageLoader); – dkarmazi