Изображение, загруженное из папки с ресурсами, имеет размер, отличный от res/drawable

В моем проекте я динамически загружал изображения из папки drawable-hdpi в ImageSwitcher следующим образом:

int[] images = new int[2];
logoImage = (ImageSwitcher) findViewById(R.id.logo_image);
images[0] = getResources().getIdentifier(ej.getImagemResource(), "drawable", getPackageName());
images[1] = getResources().getIdentifier(ej.getImagemResolvidaResource(), "drawable", getPackageName());
//...
logoImage.setImageResource(images[0]);

но для вопросов дизайна, поскольку это будет около 600 сотен маленьких изображений размером 300 x 300 пикселей каждое, я решил поместить их все в папку с ресурсами и начать загружать их следующим образом:

Drawable[] images = new Drawable[2];
images[0] = Drawable.createFromStream(getAssets().open(ej.getImagemResource() + ".png"), null);
images[1] = Drawable.createFromStream(getAssets().open(ej.getImagemResolvidaResource() + ".png"), null);
//...

Проблема в том, что во втором случае размер изображения отображается очень по-разному в зависимости от плотности устройства (я думаю), но когда изображения были в папке drawable-hdpi, они отображались просто отлично при любой плотности.

Как мне это решить? Или есть проблема иметь 600 сотен изображений в папке drawable-hdpi? Какой "правильный" способ сделать это?

заранее спасибо


person João Menighin    schedule 04.07.2014    source источник


Ответы (1)


Когда вы помещаете растровое изображение в папку drawable-<density> и нет варианта для точной плотности отображения устройства, платформа автоматически масштабирует его с учетом соотношения между <density> и плотностью устройства.

Это делается для того, чтобы размеры изображения в dps оставались постоянными между устройствами (и чтобы вы не обязаны предоставлять вариант для каждой возможной плотности).

При загрузке из ассетов плотность "исходника" неизвестна, поэтому такое автомасштабирование не выполняется. Отсюда и разница.

Если вы хотите загрузить изображение из ресурсов "как если бы это был hdpi", вы можете сделать что-то вроде:

Options opts = new BitmapFactory.Options();
opts.inDensity = DisplayMetrics.DENSITY_HIGH;
drawable = Drawable.createFromResourceStream(context.getResources(), null, is, srcName, opts);

Тем не менее, я не вижу никаких проблем с включением всех файлов в доступные папки.

person matiash    schedule 04.07.2014
comment
Спасибо за ответ. Думаю, я помещу все в res/drawable, так как это кажется более простым. Только одно: установка этого option.inDensity как DENSITY_HIGH также не будет выполнять автомасштабирование, не так ли? Я должен установить Density на плотность устройства, верно? Спасибо еще раз - person João Menighin; 05.07.2014
comment
@JoãoMenighin На самом деле так и будет. По сути, вы говорите, что он обрабатывает этот объект, как если бы он находился внутри папки drawable-hdpi. Но все же, наверное, лучше пойти другим путем. :) - person matiash; 05.07.2014