0

ImageViews我有一个在 Activity中显示 4 的应用程序。我将所有可能的图像存储在 res/drawable 文件夹中。这些图像都是 .png,大小可以从 5KB 到 22KB 不等,并且都是 300x300 像素。图像被设置为这样的方法:

private void displayChoices() {
    iv1.setImageResource(mArrayList.get(0)
            .getResourceId(this));
    iv2.setImageResource(mArrayList.get(1)
            .getResourceId(this)); // <--Usually fails on second image.
    iv3.setImageResource(mArrayList.get(2)
            .getResourceId(this));
    iv4.setImageResource(mArrayList.get(3)
            .getResourceId(this));
}

displayChoices()方法在整个会话中被多次调用。到目前为止,我已经通读了Displaying Bitmaps Efficiently,但是尝试缩小图像的分辨率会使它们变得粗糙。

mArrayList 是一个对象的 ArrayList。在对象类中,我有一个名为 getResourceId 的方法。

 public int getResourceId(Context ctx) {
    int mResId;
    String packageName = ctx.getPackageName();
    String mDrawableName = filename.substring(0, filename.lastIndexOf('.')); //filename is stored in the database and is set when I create the object. it is just a reference to the an .png file in the resource folder.

    mResId =  ctx.getResources().getIdentifier(mDrawableName , "drawable", packageName);

    return mResId;
}

图像以 2x2 网格显示,均匀分布在屏幕上。

 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false"
    android:orientation="horizontal" > 
    <FrameLayout
        android:id="@+id/choice_1_frame"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:padding="5dip" >

        <ImageView
            android:id="@+id/choice_1_image"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            android:src="@drawable/test_image300x300" />
    </FrameLayout>
    //repeat frame layout
 </LinearLayout>
 //Repeat LinearLayout

每次调用该方法时,我都尝试清除对旧图像的引用,但它在第一次调用时失败,所以我现在迷路了。关于如何阻止 OutOfMemory 异常发生的任何想法。

4

1 回答 1

0

我为解决这个问题所做的就是只记住图像的资源 ID。我写了一个带有多组卡片和大量图像的记忆游戏。仅在绘画时使用资源 ID。为此,我建议使用表面视图并使用 onDraw() 来显示图像。

onDraw() 中的示例:

mBoard[x][y] 包含一个资源 id 并且是游戏板​​。

bmp = BitmapFactory.decodeResource(mRes, mBoard[x][y]);

canvas.drawBitmap(bmp,null,rf,mPaint);

即使您使用数百张图像,这也将解决内存问题。

希望这有助于贾斯珀

于 2012-08-10T20:01:15.210 回答