1

奇妙なことが起こります - 少なくとも私には理解できません。

1 つの ImageButton に表示される画像 (w: 120px、h: 63px) があります。私が持っているその画像の唯一の変種は、drawable-hdpi に配置されています (他の描画可能なディレクトリはありません)。この画像とすべての解像度(密度)ですべて問題ありません.Androidはそれを非常にうまく処理します.

しかし、問題は、アルバムから写真 (たとえば、非常に大きな写真) を撮り、それをボタンのサイズ (前述の w: 120px h: 63px) にスケーリングし、その小さな画像を ImageButton の背景として設定するときです。

中密度 (160) のエミュレーターでテストしている場合は問題ありませんが、高密度ボタンを備えたデバイスでテストすると、スケーリングされた画像が小さく表示されるため、サイズが変更されます。

何が起こっているのか、拡大縮小した後に画像のサイズがもう一度変更されるのはなぜですか?

手がかりは高く評価されます。

画像のサイズ変更に使用するコードは次のとおりです。

public static void resizeAndSaveImage(String pathToResize, int newWidth, int newHeight, FileOutputStream output) {
try {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 8;
    Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(pathToResize), null, options);
    if (bitmap != null) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
        output.close();
    }
} catch (Exception e) {
    // ...
}

寸法パラメータは次のように渡されます: newWidth = 120、newHeight = 63。

4

1 に答える 1

1

必要なものを実現するには、物理​​ピクセルではなく、密度に依存しないピクセル (dp) を使用する必要があります。ここから読む:

密度に依存しないピクセルは、160 dpi 画面上の 1 つの物理ピクセルに相当し、プラットフォームによって想定されるベースライン密度です (このドキュメントで後述します)。実行時に、プラットフォームは、使用中の画面の実際の密度に基づいて、必要な dp 単位のスケーリングを透過的に処理します。dp 単位からスクリーン ピクセルへの変換は簡単です: ピクセル = dps * (密度 / 160)。たとえば、240 dpi の画面では、1 dp は 1.5 物理ピクセルに相当します。さまざまな画面で UI を適切に表示する方法として、dp 単位を使用してアプリケーションの UI を定義することを強くお勧めします。

これが画像リソースではなく 1 つの画像 (アルバム写真) で発生する理由をより詳細に説明するには、スケーリングに使用しているコードを投稿する必要があります。

于 2011-01-25T12:54:40.070 に答える