Разрешить автоматическое масштабирование в 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, он будет работать на обоих устройствах без сбоев. *

Итак, у меня есть два вопроса.

  1. Наклонен ли этот результат, мы можем только поместить графические ресурсы в папку для рисования с наивысшей плотностью и позволить ему автоматически уменьшаться в пределах диапазона?
  2. Что происходит внутри, почему он рухнул в первый раз?

2 ответа

  1. Это был бы один из способов сделать это до тех пор, пока масштабируемые элементы отлично выглядят. Уменьшение размера обычно лучше, чем увеличение. Тем не менее, есть эта строка:

    Даже в этом случае, когда растровые изображения масштабируются до плотности, для которой дизайн не предусмотрен, вы можете получить такие артефакты, как смягчение краев.

    Причина масштабирования от HDPI в TVDPI работает нормально, потому что две плотности так близки. Проблемы с некоторыми изображениями начнут обнаруживаться между основными плотностями. Например, прыгать от HDPI в LDPI приведет к множеству артефактов, так как изображение просто не предназначено для низких разрешений.

  2. Скорее всего, сбой с OOM в Nexus 7, потому что он берет ваши большие изображения, которые устройство считает MDPI изображения и масштабирование их до TVDPI Настройки. Это привело бы к еще большему изображению.

    Когда вы помещаете их в папку HDPI, вы говорите, чтобы уменьшить TVDPI поэтому полученное изображение занимает меньше места в памяти.

    Есть также накладные расходы, которые влияют на фактическое масштабирование.

    То же самое, вероятно, произойдет при масштабировании до устройства XHDPI.

  1. Нет, вы можете поместить графические ресурсы в любую папку для рисования. Если вы поместите ресурс только в одну папку плотности, система будет увеличиваться и уменьшаться до плотности целевого устройства.
  2. Вы хотели использовать много памяти одновременно с этими большими изображениями. Даже если вы используете сжатые форматы изображений, когда система отрисовывает их на экране, они будут в памяти в виде растрового изображения. Таким образом, если вы сохраняете в памяти одновременно изображение размером 4-500х800 пикселей, оно будет использовать этот объем памяти в растровом изображении. Это привело к краху вашего приложения, потому что ему не хватило выделенной памяти (по умолчанию она очень мала, android обеспечивает только 16 МБ, что обычно увеличивается производителями).

Когда вы помещаете изображения в hdpi, система уменьшает их, поэтому может быть (не гарантировано) достаточно памяти для меньших изображений.

Решение: не используйте эти большие изображения в качестве фона. Попробуйте красиво масштабируемые изображения и проверьте формат с 9 патчами: ссылка

Другие вопросы по тегам