2015-11-02 64 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