2015-11-02 65 views
0

我遇到了一個我實現的函數的問題。在某些手機上,我收到了內存不足錯誤。Android位圖 - 內存不足

private Bitmap getIconMarkerOfPlayer(Player p) { 
    Drawable drawable = getIconOfPlayer(p); 
    Bitmap img = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_4444); 
    Canvas canvas = new Canvas(img); 
    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
    drawable.draw(canvas); 

    final float scale = this.getResources().getDisplayMetrics().density; 
    int heigthPixels = (int) (24 * scale + 0.5f); 
    int widthPixels = (int) (24 * scale + 0.5f); 
    return Bitmap.createScaledBitmap(img, widthPixels, heigthPixels, false); 
} 

getIconMarkerOfPlayer(Player p)功能提供了根據玩家的狀態(死的,活的,離線,...)和它的顏色的「編程」繪製。在早期的比賽中,每名球員都擁有獨特的顏色。

如何從Drawable對象調整位圖而不會出現內存不足錯誤?

+0

請嘗試在這裏[顯示位圖高效](http://developer.android.com/training/displaying-bitmaps/index.html)如果你還沒有這樣做 –

回答

1

我建議你使用一些ImageLibraries來有效地加載Bitmap。

其中一些是Fresco,Glide,Piccasio

我建議你去Glide。看看它here

+0

圖片未加載來自網絡。如所做的那樣,圖像存在於可繪製文件夾中。 'getIconMarkerOfPlayer(Player p)'根據玩家的條件採用右邊的drawable,並用玩家的顏色進行着色。這個新圖像作爲新的可繪製對象返回。 問題的功能是把這個drawable變成位圖調整大小。它用於在谷歌地圖上顯示玩家的正確圖標。 – Quentin

+0

您仍然可以使用Glide進行使用Trasformations的縮放。如果您只想使用本機SDK,請查看http://stackoverflow.com/a/10703256/726625。這可能有幫助。 – sha