Использовать только XHDPI в приложении Android?
Если вы планируете поддерживать LDPI, MDPI, HPDI и, возможно, XHDPI в ближайшем будущем, можно ли включить в проект только чертежи XHDPI и позволить устройствам масштабировать их до желаемого разрешения?
Я протестировал изменение размеров элементов в MDPI и HDPI в Photoshop, а затем сравнил результат с элементами XHDPI, измененными только в Android, и я не вижу никакой разницы. Это плохой дизайн, чтобы использовать этот ярлык? Было бы неплохо не менять размеры каждого рисунка в 3 разных разрешения.
Планируется использовать целевой SDK 2.1 или 2.2.
БР Эмиль
7 ответов
Я думаю, это хороший путь. Единственный недостаток, который я могу вспомнить, - это нехватка ресурсов на небольших устройствах и возможные артефакты из-за уменьшения масштаба. На самом деле на Google IO этого года Крис Пруэтт рекомендовал встраивать только ресурсы с высоким разрешением и позволить opengl управлять масштабированием.
Начиная с Android 1.6, обрабатываются разные плотности, включая XHDPI (который официально не был добавлен до 2.2). Сначала ваше приложение будет искать изображение, соответствующее его плотности, но оно может просмотреть более крупные "сегменты", такие как XHDPI, а затем выполнить масштабирование для вас.
Лучше включать конкретные ресурсы для плотностей, которые вы хотите поддерживать. Изображение размером 100x100 занимает 40 КБ; и изображение размером 200x200 занимает 160 тыс. (без сжатия). Таким образом, любые активы XHDPI, используемые на устройствах MDPI, имеют в четыре раза больший объем данных, который вам необходим, который должен быть обработан при запуске приложения и подготовке ваших ресурсов. Меньшее использование памяти означает большую эффективность, меньше шансов на исключение OutOfMemoryException.
Кроме того, определенные типы изображений будут выглядеть плохо при автоматическом масштабировании. В частности, на изображениях с тонкими линиями или тонкими узорами их детали будут размыты. Когда вы уменьшаете изображения вручную, вы можете выбрать алгоритм, который наилучшим образом соответствует вашим потребностям (линейный, бикубический, lanczos и т. Д.).
Если вас беспокоит время, необходимое для изменения размера самостоятельно, вы можете включить пакетный процесс или использовать такие инструменты, как Nine Patch Resizer: http://code.google.com/p/9patch-resizer/
Я тестировал в простом приложении (разработка для Android 2.1), используя только изображения xhdpi, и он прекрасно работает в малых, средних и высоких разрешениях... даже я тестировал в Android 2.1 (малое разрешение), и он открывает образ без проблем.
Может быть, вещь с памятью - правда, так что нужно это кому-то проверить.
Лично я обнаружил, что использование только папки xhdpi хорошо работает во многих приложениях и является большим сторонником этого подхода. В накладных расходах памяти это правда, но с сегодняшними устройствами я бы посчитал это незначительным. Также я думаю, что после даунскейлинга происходит некоторое кеширование, так как я никогда не замечал какого-либо замедления из-за этого. Включение только одной папки может значительно уменьшить размер вашего APK, что вполне оценят конечные пользователи. Вы должны иметь в виду, что некоторые изображения будут иметь артефакты масштабирования (мелкие шаблоны и прочее), но лично я никогда не сталкивался с чем-то критичным в своих приложениях. Также для кнопок и прочего обязательно используйте 9 патчей, чтобы уменьшить артефакты на закругленных углах, вы даже можете немного уменьшить размер изображения с помощью этого подхода. Уровень API не будет проблемой в более старых версиях, так как я думаю, что drawable-xhdpi рассматривается как просто рисуемый в версиях, которые его не поддерживают. Не забывайте о шансах определить некоторые простые элементы рисования в xml, например, очень просто создать градиентный фон только с помощью фигур, и с этим вы экономите пространство и не рискуете масштабировать артефакты.
XHDPI был представлен только в Android SDK API Level 9 (Gingerbread) (см. http://developer.android.com/reference/android/util/DisplayMetrics.html), поэтому, если вы планируете иметь минимальный уровень SDK ниже 9 вы также должны будете предоставить, по крайней мере, HDPI-элементы, иначе устройства с Froyo или ниже не будут отображать ничего.
Обновление: на самом деле кажется, что версии до Gingerbread будут отображать изображения xhdpi: https://groups.google.com/d/msg/android-developers/yjYO91OmoJ4/v3he0ZbKo-UJ
Нормально иметь только ресурсы xhdpi. Но обратите внимание, что xhdpi был представлен с уровнем API 9 (пряник). То есть, если вы нацелены на уровни API <=8, вам нужны как минимум ресурсы hdpi.
Это утверждение об использовании дополнительной памяти неверно.
Если вы положите XHDPI
Размеры Drawables внутри MDPI
папка, тогда у вас будут проблемы с памятью.
Но если вы предоставите XHDPI
Drawables внутри XHDPI
папку, то дополнительная память не будет использоваться, так как Android уменьшает выборки изображений, пропуская их части.
это skipping
это причина, по которой вам нужно предоставить drawables для каждой плотности, которую вы планируете поддерживать, чтобы они хорошо выглядели.
С другой стороны, при пониженной дискретизации только определенные изображения будут выглядеть плохо (в основном это маленькие значки), поэтому, если на изображении достаточно данных для отбрасывания, оно будет выглядеть нормально. Или представьте, что у вас есть сетка в качестве прорисовки, поэтому некоторые линии сетки могут быть выброшены, и изображение будет выглядеть плохо.
В конце концов, вам лучше поэкспериментировать с различными устройствами, затем вы сможете определить, какие рисунки требуют альтернативных ресурсов для их плотности.