2

デバイスで高解像度の画像を使用しているときに問題が発生します。

 imageview a;
InputStream ims = getAssets().open("sam.png");//sam.png=520*1400 device=320*480 or 480*800
Drawable d=Drawable.createFromStream(ims, null);
a.setLayoutParams(new        LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
a.setImageDrawable(d);

上記のコード画像を使用すると、次のコンテンツの上下にスペースが残るか、固定ピクセルを指定して画像を縮小すると、そのサイズで画像がぼやけます。とにかくこの問題を解決するには?

4

2 に答える 2

0

Bitmap代わりに作成してみてくださいDrawable

Bitmap bmp = BitmapFactory.decodeStream(ims);
a.setImageBitmap(bmp);

画面密度に応じて、Androidがドローアブルでいくつかのトリックを実行しているように見えます。

于 2012-08-14T09:20:11.700 に答える
0

次の解決策が役立つことを願っています。imageView を固定サイズにして、その imageView の幅と高さをcalculateInSampleSizeメソッドに渡すことができます。画像サイズに基づいて、画像をダウンサンプリングするかどうかを決定します。

public Bitmap getBitmap(Context context, final String imagePath)
{
    AssetManager assetManager = context.getAssets();
    InputStream inputStream = null;
    Bitmap bitmap = null;
    try
    {
        inputStream = assetManager.open(imagePath);         

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = true;
        options.inJustDecodeBounds = true;

        // First decode with inJustDecodeBounds=true to check dimensions
        bitmap = BitmapFactory.decodeStream(inputStream);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, requiredWidth, requiredHeight);

        options.inJustDecodeBounds = false;

        bitmap = BitmapFactory.decodeStream(inputStream);
    }
    catch(Exception exception) 
    {
        exception.printStackTrace();
        bitmap = null;
    }

    return bitmap;
}


public int calculateInSampleSize(BitmapFactory.Options options, final int requiredWidth, final int requiredHeight) 
{
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if(height > requiredHeight || width > requiredWidth) 
    {
        if(width > height) 
        {
            inSampleSize = Math.round((float)height / (float)requiredHeight);
        } 
        else 
        {
            inSampleSize = Math.round((float)width / (float)requiredWidth);
        }
    }

    return inSampleSize;
}
于 2012-08-14T09:44:05.270 に答える