2013-03-11 2 views
2

Много блогов и лучших практик для развития Android говоритРазрешить автоматическое масштабирование в Android Drawables для различных плотностей?

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

Reference Link: https://plus.google.com/105051985738280261832/posts/6eWwQvFGLV8

Я попробовал это works well. Но я не мог понять одну вещь.

Например, я создал образец приложения с 5 полноэкранными изображениями размером около 1,5 МБ каждый в представлении пейджера.

Я создал тяжелые изображения для 7-дюймовых устройств MDPI, таких как Galaxy Tab 2, и поместил их в папку «drawable-large-mdpi». Он был немного отрывистым, но не разбился и позволил мне прокрутить все изображения.

Теперь я попытался использовать приложение на своем Nexus 7, которое является почти большим устройством HDPI. Приложение разбилось с ошибкой OOM при декодировании растрового изображения.

* Если я перемещаю изображения с большого MDPI на большой HDPI, он отлично работает на обоих устройствах без какого-либо сбоя. *

У меня есть два вопроса.

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

ответ

0
  1. Нет, вы можете поместить графические объекты в любую доступную папку. Если вы разместите ресурс только в одной папке с плотностью, система будет масштабироваться вверх и вниз до плотности целевого устройства.
  2. Вы хотели использовать большую память при одновременном использовании этих больших изображений. Даже если вы используете сжатые форматы изображений, когда система рисует его на экране, он будет в памяти как растровое изображение. Поэтому, если вы сохраняете 4-5 пикселей в 1200x800 пикселей в памяти, в то же время он будет использовать этот объем памяти в растровом изображении. Это разбило ваше приложение, потому что оно закончилось из предоставленной памяти (которая по умолчанию очень низкая по умолчанию, а только для Android - только 16 мб, который обычно расширяется производителями).

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

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

+0

Я знаю, что 9 патчей - хорошая концепция. Но иногда мы не можем помочь, поскольку вы знаете, что требования клиентов не будут меняться. И я бы не рекомендовал использовать какую-либо папку, как упоминалось Deev ... в результате довольно ясно ... – Nova

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

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

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

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

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

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

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