0

ImageViewsアクティビティに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 に答える