自分で画像を拡大縮小する場合は、次の場所に1つのコピーを入れます。
res/drawable-nodpi
リソースが他のフォルダにないことを確認してください。
次のようにビットマップをロードします。
Bitmap bitmap = BitmapFactory.decodeResource(
context.getResources(),
R.drawable.my_image
);
次のようにサイズを変更します。
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
次に、それをキャンバスに描画します。
canvas.drawBitmap(bitmap, 0, 0, null);
それはあなたが仕事を成し遂げるために知る必要がある最小のものです。
その他の注意事項
通常、Androidは、現在の画面密度に基づいて、res/drawableフォルダーの1つから画像を選択します。
ほとんどの画像形式には密度情報がないため、Androidは、ロード元のフォルダーに基づいてビットマップの密度を想定します。
つまり、ロードされたビットマップの密度をキャンバスの密度と一致させるために、独自のスケーリングを実行できます。
Androidは、ビットマップをロードするときに1回、ビットマップを描画するときにもう一度密度をチェックして照合します。
独自のスケーリングを行う場合、通常、OSが干渉しないようにする必要があります。あなたがそれをすることができるいくつかの方法があります:
1. res/drawable-nodpiを使用します
これは、上記の簡単な例で概説した戦略です。画像をリソースとしてパッケージ化し、スケーリングを自分で制御したい場合は、ここに配置します。ここにのみ配置します。
res/drawable-nodpi
カップケーキをサポートする必要がある場合は、代わりにこれらの各フォルダーにコピーを入れてください。
res/drawable-nodpi-v4
res/drawable
デコーダーには、スケーリングを防ぐためのオプションが自動的に提供されます。次に、Androidは画像密度を画面に一致するように設定するため、描画しても拡大縮小されません。コンパイラは、res/drawable-xxxフォルダに配置された画像に可逆圧縮を適用します。
2. res/rawを使用します
次の場所に画像を配置すると、コンパイラは画像をそのままにしておくことができます。
res/raw
ただし、実行時にスケーリングしないように注意する必要があります。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false; // Prevents scaling at decode time.
Bitmap bitmap = BitmapFactory.decodeResource(
context.getResources(),
R.raw.my_image,
options
);
bitmap.setDensity(Bitmap.DENSITY_NONE); // Prevents scaling at draw time.
3.アセットフォルダを使用します
画像をresではなくassetsフォルダーに配置すると、実際のフォルダー構造を使用して画像を整理できます。次のようなビットマップアセットをロードします。
Bitmap bitmap = BitmapFactory.decodeStream(
context.getAssets().open(
"myfolder/my_image.png",
AssetManager.ACCESS_BUFFER
)
);
コンパイラはそれに触れず、スケーリングせずにロードし、密度は画面に一致するように設定されているため、描画してもスケーリングされません。
(パフォーマンスに関する注意:Androidは画像を読み込む前に、ファイルを見つける必要があります。リソースはアセットよりもすばやく見つけることができるため、画像をアセットとしてパッケージ化すると、パフォーマンスが低下する可能性があります。)