Android Drawable изменяет размеры на экране при чтении изображения из файла - PullRequest
4 голосов
/ 15 апреля 2010

У меня есть изображение в личном файле. Я прочитал файл, создал drawable и назначил его для ImageView. ImageView имеет WRAP_CONTENT, поэтому размер автоматически.

На экранах 320x480 изображение выглядит хорошо Но на экранах с большим разрешением и высокой плотностью 480x800 или 480x854 (N1, droid), когда изображение, например, 150x150, я вижу изображение 100x100.

Конечно, это как-то связано с плотностью, но я не уверен, как мне решить эту проблему.

Это мой код:

FileInputStream fis = this.openFileInput("icon.png");

icon = Drawable.createFromStream(fis, "icon");

fis.close();

imageView.setImageDrawable(icon);

спасибо

=============================================== =================

Обновление:

со следующим кодом:

FileInputStream fis = this.openFileInput ("icon.png");

icon = Drawable.createFromStream (fis, "icon");

если я затем проверю размер значка, андроид считает, что размер равен 100x100, а на самом деле - 150x150.

Похоже, это уменьшает изображение на плотность. Кто-нибудь может объяснить это и как этого избежать.

Спасибо

Ответы [ 4 ]

2 голосов

Попробуйте BitmapDrawable # setTargetDensity:

Bitmap b = BitmapFactory.decodeFile(path)
BitmapDrawable bmd = new BitmapDrawable(b);
bmd.setTargetDensity(getResources().getDisplayMetrics());
2 голосов
/ 17 декабря 2010

Масштабируйте изображение до нужного размера:

            d = Drawable.createFromPath(filePath);
            if (d != null) {
                Bitmap bitmapOrg = ((BitmapDrawable) d).getBitmap();
                int width = bitmapOrg.getWidth();
                int height = bitmapOrg.getHeight();
                int newWidth = 170;
                int newHeight = 170;
                // calculate the scale
                float scaleWidth = ((float) newWidth) / width;
                float scaleHeight = ((float) newHeight) / height;
                // create a matrix for the manipulation
                Matrix matrix = new Matrix();
                // resize the bit map
                matrix.postScale(scaleWidth, scaleHeight);
                Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
                width, height, matrix, true);
                // make a Drawable from Bitmap to allow to set the BitMap
                d = new BitmapDrawable(resizedBitmap);
            }
2 голосов
/ 10 августа 2011

Я работаю над аналогичной проблемой, попробуйте это:

TypedValue typedValue = new TypedValue();
//density none divides by the density, density default keeps the original size
typedValue.density = TypedValue.DENSITY_DEFAULT;
Drawable d = Drawable.createFromResourceStream(null, typedValue, fis, "icon");

Я все еще работаю над тем, как разработать общее решение для выбора разрешения / изменения размера изображений из общего потока вместо каталогов drawable- *.

1 голос
/ 16 апреля 2010

Установите некоторые размеры в независимых от устройства пикселях (или DIP).

...