我正在为安卓开发一款纸牌游戏。当我尝试加载一些图像时出现 OutOfMemoryError。我已经阅读了很多关于 android 中这个常见和常见问题的答案,但是当要加载的图像非常大时,它们都会处理。我自己管理屏幕旋转,所以我不会重新启动新的旋转活动。我已经读过这个问题:
我不明白的一件事是,如果我在 res 文件夹中的所有图像(png 文件)的大小总和约为 800 kb。但在 Logcat 中,我注意到创建游戏(加载卡图像)的大小迅速超过 20 mb。我使用:此代码加载图像
Resources r = this.getContext().getResources();
CardView.loadCardImages(CardView.EAlone.CARDS, 1027, 615, r.getDrawable(R.drawable.cards));
CardView.loadCardImages(CardView.EAlone.GREEN, mCardWidth, mCardHeight, r.getDrawable(R.drawable.green));
CardView.loadCardImages(CardView.EAlone.RED, mCardWidth, mCardHeight, r.getDrawable(R.drawable.red));
CardView.loadCardImages(CardView.EAlone.WHITE, mCardWidth, mCardHeight, r.getDrawable(R.drawable.white));
CardView.LoadCardImages:
public static void loadCardImages(EAlone mode, int widthPixels, int heightPixels, Drawable tile) {
Canvas canvas;
switch (mode)
{
case GREEN:
mAloneGreen = Bitmap.createBitmap(widthPixels, heightPixels, Bitmap.Config.ARGB_8888);
canvas = new Canvas(mAloneGreen);
break;
case RED:
mAloneRed = Bitmap.createBitmap(widthPixels, heightPixels, Bitmap.Config.ARGB_8888);
canvas = new Canvas(mAloneRed);
break;
case WHITE:
mAloneWhite = Bitmap.createBitmap(widthPixels, heightPixels, Bitmap.Config.ARGB_8888);
canvas = new Canvas(mAloneWhite);
break;
default:
mcardImages = Bitmap.createBitmap(widthPixels, heightPixels, Bitmap.Config.ARGB_8888);
canvas = new Canvas(mcardImages);
}
tile.setBounds(0, 0, widthPixels, heightPixels);
tile.draw(canvas);
tile.setCallback(null);
}
mCardimages 包含所有卡片面。然后我使用此文件通过从文件中裁剪所需的卡片来创建单张卡片。加载后,我加载了一些在我的父视图中具有透明度的其他图像。
dealerSign = new ImageView(getContext());
dealerSign.setImageResource(R.drawable.dealer);
dealerSign.setAdjustViewBounds(true);
dealerSign.setLayoutParams(new Gallery.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
我在 setImageResource 行收到错误。
04-09 22:04:37.226: E/AndroidRuntime(722): FATAL EXCEPTION: main
04-09 22:04:37.226: E/AndroidRuntime(722): java.lang.OutOfMemoryError
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.Bitmap.nativeCreate(Native Method)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:767)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.content.res.Resources.loadDrawable(Resources.java:1937)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.content.res.Resources.getDrawable(Resources.java:664)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.widget.ImageView.resolveUri(ImageView.java:537)
04-09 22:04:37.226: E/AndroidRuntime(722): at android.widget.ImageView.setImageResource(ImageView.java:310)
04-09 22:04:37.226: E/AndroidRuntime(722): at game.spathi.GameView.init(GameView.java:261)
04-09 22:04:37.226: E/AndroidRuntime(722): at game.spathi.Game.onCreate(Game.java:92)
...
我在这里做错了什么?
谢谢!