Разрешить автоматическое масштабирование в Android Drawables для различной плотности?
Многие блоги и лучшие практики для разработки Android говорят
" Вам не нужно предоставлять растровые изображения для каждой возможной плотности, Android будет масштабировать ваши растровые изображения (обычно, когда они загружены), чтобы соответствовать текущей плотности ".
Ссылочная ссылка: https://plus.google.com/105051985738280261832/posts/6eWwQvFGLV8
Я пытался это работает хорошо. Но я не мог понять одну вещь.
Например, я создал пример приложения с 5 полноэкранными изображениями размером около 1,5 МБ каждое в пейджере просмотра.
Я создал тяжелые изображения для 7-дюймовых MDPI-устройств, таких как Galaxy Tab 2, и поместил их в папку drawable-large-mdpi. Это было немного отрывисто, но не вылетело и позволило мне пролистать все изображения.
Теперь я попытался использовать приложение на своем Nexus 7, который является почти большим HDPI-устройством. Приложение завершилось с ошибкой OOM при декодировании растрового изображения.
* Если я перенесу изображения с большого MDPI на большой HDPI, он будет работать на обоих устройствах без сбоев. *
Итак, у меня есть два вопроса.
- Наклонен ли этот результат, мы можем только поместить графические ресурсы в папку для рисования с наивысшей плотностью и позволить ему автоматически уменьшаться в пределах диапазона?
- Что происходит внутри, почему он рухнул в первый раз?
2 ответа
Это был бы один из способов сделать это до тех пор, пока масштабируемые элементы отлично выглядят. Уменьшение размера обычно лучше, чем увеличение. Тем не менее, есть эта строка:
Даже в этом случае, когда растровые изображения масштабируются до плотности, для которой дизайн не предусмотрен, вы можете получить такие артефакты, как смягчение краев.
Причина масштабирования от
HDPI
вTVDPI
работает нормально, потому что две плотности так близки. Проблемы с некоторыми изображениями начнут обнаруживаться между основными плотностями. Например, прыгать отHDPI
вLDPI
приведет к множеству артефактов, так как изображение просто не предназначено для низких разрешений.Скорее всего, сбой с OOM в Nexus 7, потому что он берет ваши большие изображения, которые устройство считает
MDPI
изображения и масштабирование их доTVDPI
Настройки. Это привело бы к еще большему изображению.Когда вы помещаете их в папку HDPI, вы говорите, чтобы уменьшить
TVDPI
поэтому полученное изображение занимает меньше места в памяти.Есть также накладные расходы, которые влияют на фактическое масштабирование.
То же самое, вероятно, произойдет при масштабировании до устройства XHDPI.
- Нет, вы можете поместить графические ресурсы в любую папку для рисования. Если вы поместите ресурс только в одну папку плотности, система будет увеличиваться и уменьшаться до плотности целевого устройства.
- Вы хотели использовать много памяти одновременно с этими большими изображениями. Даже если вы используете сжатые форматы изображений, когда система отрисовывает их на экране, они будут в памяти в виде растрового изображения. Таким образом, если вы сохраняете в памяти одновременно изображение размером 4-500х800 пикселей, оно будет использовать этот объем памяти в растровом изображении. Это привело к краху вашего приложения, потому что ему не хватило выделенной памяти (по умолчанию она очень мала, android обеспечивает только 16 МБ, что обычно увеличивается производителями).
Когда вы помещаете изображения в hdpi, система уменьшает их, поэтому может быть (не гарантировано) достаточно памяти для меньших изображений.
Решение: не используйте эти большие изображения в качестве фона. Попробуйте красиво масштабируемые изображения и проверьте формат с 9 патчами: ссылка