1

次のような 14 個の Bitmap オブジェクトを作成します。

bmp[0]=BitmapFactory.decodeResource(getResources(), R.drawable.a0000);
bmp[1]=BitmapFactory.decodeResource(getResources(), R.drawable.a0001);
bmp[2]=BitmapFactory.decodeResource(getResources(), R.drawable.a0002);
bmp[3]=BitmapFactory.decodeResource(getResources(), R.drawable.a0003);
bmp[4]=BitmapFactory.decodeResource(getResources(), R.drawable.a0004);
bmp[5]=BitmapFactory.decodeResource(getResources(), R.drawable.a0005);
bmp[6]=BitmapFactory.decodeResource(getResources(), R.drawable.a0006);
bmp[7]=BitmapFactory.decodeResource(getResources(), R.drawable.a0007);
bmp[8]=BitmapFactory.decodeResource(getResources(), R.drawable.a0008);
bmp[9]=BitmapFactory.decodeResource(getResources(), R.drawable.a0009);
bmp[10]=BitmapFactory.decodeResource(getResources(), R.drawable.a0010);
bmp[11]=BitmapFactory.decodeResource(getResources(), R.drawable.a0011);
bmp[12]=BitmapFactory.decodeResource(getResources(), R.drawable.a0012);
bmp[13]=BitmapFactory.decodeResource(getResources(), R.drawable.a0013); 

これらのビットマップは背景のアニメーションを作成するために使用され、リソースは 320x480 ピクセルの 14 個の jpj 画像です。カスタム ビューを作成し、onDraw メソッドでビットマップを呼び出します。次に、画像と同じ解像度の携帯電話でアプリをテストし、スムーズに実行してから、より大きな解像度 (1280x720 など) のタブレットでアプリを使用しようとしましたが、背景が画面全体に収まりません。 、そのため、デバイスの解像度に基づいて異なる解像度の新しいビットマップを作成して画面全体を埋める方法を調査したところ、結果は次のようになりました。

newWidth= context.getResources().getDisplayMetrics().widthPixels;
newHeight= context.getResources().getDisplayMetrics().heightPixels;

int contador=0;

        do{
             bmp[contador]= Bitmap.createScaledBitmap(bmp[contador], newWidth,                   newHeight,true);
       contador++;
       }while(contador<13);

次に、これらの行を onDraw メソッドに追加するだけです。

   canvas.drawBitmap(bmp[i], 0, 0, null);
    i++;

携帯電話でアプリをテストすると問題なく動作しますが、タブレットでテストすると「ビットマップ サイズが VM の予算を超えています」というエラーが表示されます。 14 個の bmp Bitmap オブジェクトを作成し、bmp2 というビットマップの 2 番目の配列を作成し、必要なときにのみビットマップを割り当ててから、onDraw メソッドで次のようにクリアします。

   bmp2[i]= Bitmap.createScaledBitmap(bmp[i], newWidth, newHeight,true);
  canvas.drawBitmap(bmp2[i], 0, 0, null);
 bmp2[i].recycle();
 bmp2[i]=null;

タブレットと携帯電話で動作しますが、パフォーマンスが非常に悪いのは、(onDraw メソッドで) リアルタイムで画像を割り当てるためだと思いますが、リサイクル メソッドを使用して bmp2 を再度割り当てない場合はありません。新しいbmp2...

最後に、私の本当の質問は次のとおりです。画像を表示した後にメモリをクリアし、再び必要になったときに使用できるようにするにはどうすればよいですか。ありがとう!

4

4 に答える 4

1

小さなビットマップをスケールアップして大きな画面に表示しても、高品質の結果が得られないことについて言及した人もいます。とにかく、特定の質問に答えるために、メモリエラーなしで画面いっぱいに拡大された低解像度ビットマップを描画する方法を次に示します。

Canvas.drawBitmap()描画中にビットマップを正しいサイズにスケーリングできる代替方法のいずれかを使用する必要があります。

例えば:

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)

Javadocから:

指定されたビットマップを描画し、自動的にスケーリング/変換して、宛先の四角形を塗りつぶします。

dst前に計算した画面サイズになるように四角形を設定します。次に、メモリ内に個別のスケーリングされたビットマップを作成する必要がないため、問題は解決します。

于 2013-05-20T09:42:44.713 に答える
0

タブレットやその他の上位画面用に新しいビットマップを設計し、それらを res ディレクトリの下の xhdpi フォルダーに配置する必要があります。これは最も効率的なオプションです。Android OS 自体が最適なリソースを取得します。

詳細なヘルプについては、これを参照してください http://developer.android.com/training/multiscreen/index.html

これはドキュメントが言うことです

アプリケーションがさまざまな画面で動作するようにスケーリングとサイズ変更がシステムによって実行されますが、さまざまな画面サイズと密度に合わせてアプリケーションを最適化するように努力する必要があります。そうすることで、すべてのデバイスのユーザー エクスペリエンスを最大化し、ユーザーは、アプリケーションがデバイスの画面に合わせて単純に拡大されるのではなく、実際にデバイス用に設計されていると信じます。

于 2013-05-20T08:23:36.613 に答える