0

1.6 用のアプリを作成していますが、Android の画像スケーリングに問題があります。480x295 の画像があります。

中程度の画面ではこれは正しく表示されますが、大画面 (480x800 または 480x854) では画面いっぱいに表示されず、Android によって画像が 1.5 倍大きくなり、720x442 になります。

800 は実際には 1.67 であり、854 は 1.78 であるため、もちろん drawable-hdpi フォルダーに大きな画像を含めることができますが、画像は既に 1.5 MB であり、人々が好むと思われるサイズよりも大きく、app2sd を使用することはできません。 1.6 をサポートしたい。

助言がありますか?

考えられる選択肢は 3 つだけです: 1) より大きな画像を含める (ただし、これにより売上が制限される可能性があり、apk のサイズが明らかに増加します)

2)2つのバージョンを作成します。これは良い解決策のようですが、実装が難しいだけです。

3) 1.5 に変更し、すべてのスケーリングを自分で処理します。

編集:詳細:キャンバスとサーフェスビューを使用して描画しています 画像読み込みコード:

backgroundBMP = BitmapFactory.decodeResource(getResources(), R.drawable.background, null);

そして描画コード:

canvas.drawBitmap(backgroundBMP, 0, 0, null);
4

3 に答える 3

5

自分で画像を拡大縮小する場合は、次の場所に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は画像を読み込む前に、ファイルを見つける必要があります。リソースはアセットよりもすばやく見つけることができるため、画像をアセットとしてパッケージ化すると、パフォーマンスが低下する可能性があります。)

于 2011-03-08T10:52:29.153 に答える
3

スケーリングしたい場合は、 beforeBitmapを使用して行うことができます。アスペクト比を計算し、それをスケール値として使用できます。canvas.scale(scaleX, scaleY);canvas.drawBitmap()

追加する重要な点の 1 つは、「SD カードに移動」機能を使用<uses-sdk android:minSdkVersion="3" />して、minSdkVersion.

于 2011-02-26T11:51:52.513 に答える
2

Viktor が提案したように、Canvas.scale() を実行できます。BitmapDrawable (ビューの背景として設定) を使用してビットマップを描画することもでき、スケーリングは自動的に行われます。

于 2011-02-26T11:54:22.583 に答える