- Основы
- Как Android преобразует размеры ресурсов
- Теория
- Методика тестирования
- Одинаков ли алгоритм свертки для переходов 1.5 → 1 и 1.33 → 1 ?
- Отбрасывает ли Android «лишний» пиксель при свертке 1.5 → 1 ?
- Как происходит свертка 2 → 1 ?
- Как происходит свертка 4 → 1 ?
- Какой ресурс выбирает Android если вариантов несколько?
- Какой из этого всего можно сделать вывод?
- Русские Блоги
- Android hdpi ldpi mdpi xhdpi xxhdpi подробная адаптация
Основы
Существует огромное количество устройств с разными размерами экрана от 2.6 до 6 дюймов (для телефонов) с разрешениями от 240х320 до 1440х2560 пикселей с плотностью от ldpi до xxxhdpi. И дизайнеру нужно уметь создать правильный макет для зоопарка устройств.
На данный момент Android поддерживает следующие параметры: ldpi, mdpi, hdpi, xhdpi, xxhdpi and xxxhdpi.
Базовой является плотность mdpi, когда 1px = 1dp. Остальные являются множителями:
Как уже я сказал, MDPI является базовой точкой отсчёта и соответствует размеру экрана 320х480 пикселей. Для HDPI — 480×720, XHDPI — 640×960.
Размер устройства в DP вычисляется по формуле: разрешение экрана делим на множитель, указанный выше.
Например, устройство с разрешением экрана 240х320px соответствуют 320х426.66dp (240 / 0.75 = 320; 320 / 0.75 = 426.66).
Соответственно, устройство с экраном 1080х1920 (Samsung S5) соответствует типу XXHDPI — 360x640dp (1080 / 3 = 360; 1920 / 3 = 640dp)
Дизайнер должен подготовить ресурсы для всех основных типов экрана и разместить их в соответствующих папках, а система сама выберет нужный ресурс из нужной папки.
Что будет, если подготовить одну картинку? Есть два варианта. Допустим, вы приготовили картинку для базового размера во весь экран. На современных телефонах картинка растянется в 3-4 раза и будет размыта. Хорошо, пойдём от обратного и подготовим картинку для самого большого экрана. Тут нас может ожидать другая неприятность — нехватка памяти. Большая картинка может занимать размер от 2Мб и выше. Маленькие экраны физически не смогут показать такое изображение, но будут при этом потреблять в 3-4 раза больше памяти, которой может не хватить для приложения.
Также следует учитывать, что размеры экрана у разных устройств увеличиваются/уменьшаются непропорционально по ширине и высоте. Поэтому дизайн экрана приложения должен быть достаточно гибким.
Обычно создаётся дизайн сверху вниз. Вначале наибольший размер, который будет поддерживаться приложением, а потом постепенно уменьшают все ресурсы для других разрешений.
Для фона экрана приложения используются следующие типы ресурсов:
- Color
- Gradient
- 9-patch Drawable
- Повторяющие фрагменты
- Картинка на весь экран
Выше объяснялось, почему не стоит использовать последний вариант. Если ли приходится работать с этим вариантом, то используйте следующую технику. Допустим, дизайнером была подготовлена очень большая картинка на весь экран в альбомном режиме. На телефоне можно применить кадрирование и показать только центральную часть.
У компонента ImageView есть атрибут scaleType с значением CENTER_CROP.
Также можно поместить изображение в центр и добавить цветную или градиентную рамку вокруг него.
Используйте в этом случае scaleType = CENTER_INSIDE.
Если фон однородный и его можно растянуть без ущерба качеству, то воспользуйтесь scaleType = FIT_XY.
Источник
Как Android преобразует размеры ресурсов
Размер APK файла можно уменьшить, выкинув «ненужные» LDPI ресурсы, Android все равно умеет генерировать их на лету из MDPI. Но что будет если убрать еще и MDPI каталог? И как именно будет произведена свертка: усреднением или более дешевым выбрасыванием пикселей? Перескочит ли Android через один шаг чтобы произвести потенциально более простое преобразование HDPI → LDPI? Как именно происходит уменьшение картинок в разных случаях? Чтобы ответить на эти вопросы я провел небольшой тест.
Теория
33.(3) или 50%, то есть MDPI ресурс должен быть примерно в 1.33 раза больше LDPI, а HDPI — уже в 2 раза больше. При преобразованиях 2 → 1 и 4 → 1 теоретически возможны «дешевые» отбрасыванием каждого второго пикселя, при переходе 1.5 → 1 теоретически возможна оптимизация с отбрасыванием одного пикселя из трех, а при переходе 1.33 → 1 — одного из четырех, осталось проверить какие оптимизации и алгоритмы использует Android в действительности.
Методика тестирования
Создаем файл с повторяющимся паттерном из разноцветных полос шириной в один и два пикселя, чтобы проще было видеть результат свертки. Паттерны выглядят так:
и размещены со смещением 0, 1 и 2 пикселя от границы (паттерны однонаправленные, так как вертикальная и горизонтальные свертки очевидно должны использовать одинаковый алгоритм).
Помещаем картинку (одну и ту же) в каталоги LDPI, MDPI и т.д под разными именами и на каждой копии рисуем «водяной знак» обозначающий каталог, в котором она находится, чтобы знать, откуда Android взял исходник для преобразования. Отображаем картинки изо всех (MDPI-XXXDPI) каталогов на разрешениях от LDPI до XXHDPI. Смотрим под лупой, что же получилось, и отвечаем на вопросы.
Одинаков ли алгоритм свертки для переходов 1.5 → 1 и 1.33 → 1 ?
Очевидно нет, можно сравнить, как выглядит паттерн из каталога HDPI на MDPI экране и паттерн MDPI на LDPI
при этом результаты сверток x → h и m → l совпадают, что подтверждает теорию.
Отбрасывает ли Android «лишний» пиксель при свертке 1.5 → 1 ?
Судя по всему, да! Для этого сделаем другой паттерн (также со смещением 0, 1 и 2 пикселя)
▣ ▣ ▣ ▣ ▣ ▣ и смасштабируем его из HDPI в MDPI
на итоговом паттерне поочередно выпадают то красный, то синий, то зеленый цвета, значит при калькуляции 2 пикселей из 3, один не принимается в расчёт. Итоговые цвета не чистые, значит, оставшиеся два пикселя не берутся как есть, а смешиваются в разной пропорции.
Как происходит свертка 2 → 1 ?
Простым замешиванием соседних пикселей парами в равных пропорциях. Тут результаты переходов h → l, xh → m, xxh → h идентичны.
Артефактов отбрасывания пикселей не замечено.
Как происходит свертка 4 → 1 ?
А вот тут Android все-таки выбрасывает часть пикселей. Судя по всему, берутся четверки пикселей, два крайних удаляются, а центральные замешиваются в равной пропорции. Примерно так:
Именно этот алгоритм является причиной интересного артефакта — полного пропадания синего и красного цветов из паттернов ▣ ▣ ▣ ▣ и ▣ ▣ ▣ ▣ , которые отличаются только смещением.
Какой ресурс выбирает Android если вариантов несколько?
При свертке до MDPI ресурса, который имеется в HDPI и XHPI каталогах можно было бы применить потенциально более простой алгоритм 2 → 1 вместо 1.5 → 1, пропустив одну ступень, но Android всегда выбирает ближайший ресурс. Вероятно, еще и потому, что свертка 2 → 1 использует более ресурсоемкое замешивание, а не отбрасывание (как мы видели выше), и сэкономить на ней сильно не получится.
Какой из этого всего можно сделать вывод?
Ну во-первых, надо не забывать напоминать своему дизайнеру, что рисовать нужно по сетке и что 1dp != 1px: любая однопиксельная линия на всех разрешениях от MDPI и выше может превратиться в непредсказуемую размазню или вовсе пропасть. Во-вторых, SVG/XML все-таки более надежный способ экономии на графике, если характер картинки позволяет. В-третьих, если итоговая картинка на экрана должна иметь четкие грани, все разрешения должны присутствовать в проекте. Ну и наконец, Android, действительно применяет интересные оптимизации, чтобы сэкономить процессорные ресурсы, и этим можно пользоваться, если делать это с умом.
Пример работы тестового приложения на разных разрешениях (на каждой картинке написано из какого каталога, она взята, рядом с ней — в каких каталогах она присутствовала):
Источник
Русские Блоги
Android hdpi ldpi mdpi xhdpi xxhdpi подробная адаптация
1. Понять несколько понятий
(1) Разрешение. Разрешение — это количество пикселей на экране мобильного телефона, которое обычно определяется как «ширина х высота» экрана. Общие разрешения для экранов телефонов Android: 480 × 800, 720 × 1280, 1080 × 1920 и т. Д. 720 × 1280 указывает, что этот экран имеет 720 пикселей в направлении ширины и 1280 пикселей в направлении высоты.
(2) Размер экрана. Размер экрана — это физический размер диагонали телефона, в дюймах. Например, определенный мобильный телефон представляет собой «5-дюймовый мобильный телефон с большим экраном», который относится к диагонали размером 5 дюймов × 2,54 см / дюйм = 12,7 см.
(3) Плотность (точек на дюйм, точек на дюйм; или PPI, пикселей на дюйм). Как следует из названия на английском языке, это количество пикселей на дюйм. Чем выше значение, тем более деликатный дисплей. Если мы знаем, что разрешение мобильного телефона составляет 1080 × 1920, а размер экрана составляет 5 дюймов, можете ли вы рассчитать плотность этого экрана? Ха-ха, теорема Пифагора в средней школе пригодилась! Через ширину 1080 и высоту 1920, согласно теореме Пифагора, мы получили, что число диагональных пикселей составляет приблизительно 2203. Тогда плотность этого экрана делится на 2203 на 5. Результат вычисления — 440. Экран 440 точек на дюйм довольно деликатный. ,
2. Фактическая плотность и плотность системы
В других местах я не нашел слов «фактическая плотность» и «плотность системы». Позвольте мне определить их на данный момент.
«Фактическая плотность» — это плотность, которую мы сами рассчитали. Эта плотность представляет фактическую тонкость экрана. Например, 440 точек на дюйм в приведенном выше примере — это фактическая плотность, указывающая, что этот экран имеет 440 на дюйм. пиксели. Плотность экрана 5 дюймов с разрешением 1080 × 1920 составляет 440, а плотность экрана 4,5 дюйма с тем же разрешением составляет 490. С этой точки зрения, плотность экрана будет много значений, показывая серьезную фрагментацию. А плотность — это основа для экрана Android для увеличения интерфейса, так как же Android адаптируется к такому количеству экранов?
Фактически каждый экран телефона Android имеет начальную фиксированную плотность. Это значения 120, 160, 240, 320 и 480. Мы называем их «системная плотность». Вы нашли, что нет никаких правил? Между значениями разделения существует двоякая связь. Обычно экран 240 × 320 имеет низкую плотность 120 точек на дюйм, то есть ldpi, экран 320 × 480 имеет среднюю плотность 160 точек на дюйм, то есть mdpi, экран 480 × 800 — это плотность 240 точек на дюйм, то есть hdpi, экран 720 × 1280 — супер Высокая плотность 320 точек на дюйм, а именно xhdpi; 1080 × 1920 экран сверхвысокой плотности 480 точек на дюйм, а именно xxhdpi.
Android масштабирует элементы интерфейса на основе плотности системы, а не фактической плотности.
3. Важная единица дп
dp также можно записать как dip, то есть независимый от плотности пиксель. Вы можете себе представить, что dp больше похож на физический размер: например, картинка с шириной и высотой 100dp «выглядит» размером с телефоны 320×480 и 480×800. В действительности их значения пикселей не совпадают. Размер dp как раз такого размера, независимо от плотности экрана, одни и те же элементы размера dp на экране всегда выглядят почти одинаково.
Кроме того, в качестве размера текста используется sp, что является аббревиатурой от независимого от масштаба пикселя. Таким образом, при настройке размера шрифта в системных настройках текст в приложении также будет становиться все больше и меньше.
4, преобразование dp и px
В Android экран мобильного телефона средней плотности с системной плотностью 160 точек на дюйм является базовым экраном, то есть экраном мобильного телефона 320 × 480. На этом экране 1dp = 1px.
100dp — это 100px в 320 × 480 (т / д, 160 т / д). Итак, сколько стоит 100dp на телефоне 480 × 800 (hdpi, 240dpi)? Мы знаем, что 100dp выглядит почти одинаково на обоих телефонах. Согласно соотношению между 160 и 240, мы можем знать, что при 480 × 800 100dp фактически покрывает 150px. Поэтому, если вы предоставите изображение с разрешением 100px для телефона с разрешением MDPI, оно будет растягиваться до 150px на телефоне с разрешением HDMI, но все они имеют разрешение 100 точек на дюйм.
Кажется, что коэффициенты масштабирования средней и высокой плотности можно рассчитать не по 160dpi и 240dpi, а также по 320px и 480px. Однако вычисление коэффициента масштабирования на основе ширины не подходит для сверхвысокой плотности xhdpi и сверхвысокой плотности xxhdpi. То есть, сколько пикселей составляет 1 дп при 720 × 1280? Если вы используете 720/320, вы получите 1dp = 2.25px, что на самом деле неверно. Преобразование между dp и px основано на плотности системы.Плотность системы 720 × 1280 равна 320, а плотность системы 320 × 480 равна 160. 320/160 = 2, затем в 720 × 1280, 1dp = 2px. Аналогично, в 1080 × 1920, 1dp = 3px.
Вы можете запомнить следующее соотношение, преобразование между dp и px очень просто!
ldpi: mdpi: hdpi: xhdpi: xxhdpi = 3: 4: 6: 8: 12, мы обнаружили, что между разделенными числами все еще существует двойная связь. Расчет основан на МДПИ. Например, в 720 × 1280 (xhdpi), сколько пикселей равно 1 dp? Соотношение между mdpi равно 4, а xhdpi равно 8,2 раза, то есть 1dp = 2px. Напротив, расчет важнее: например, если вы используете PhotoShop для создания карты эффекта интерфейса на холсте 720 × 1280, расстояние между двумя элементами составляет 20 пикселей. Сколько dp следует отметить? Удвойте отношения, это 10dp!
Когда размер шрифта системы Android установлен на «нормальный», преобразование размеров между sp и px и dp и px одинаково. Например, если размер текста составляет 24px на холсте с разрешением 720 × 1280 PS, сообщите инженеру, что размер текста составляет 12sp.
5. Рекомендуется отобразить в xdhpi
В телефонах Android так много экранов, какой экран использовать для рисования? Нет необходимости предоставлять набор материалов для мобильных телефонов различной плотности, в большинстве случаев достаточно одного набора.
Теперь более высокое разрешение мобильного телефона составляет 1080 × 1920. Вы можете выбрать этот размер для рисования, но материал изображения увеличит размер установочного пакета приложения. И чем больше размер картинки, тем выше память. Если вы не проектируете ПЗУ, а создаете приложение, я предлагаю вам использовать PS для рисования на холсте 720 × 1280. Этот размер уравновешивает эстетику, экономичность и простоту расчета. Эстетика означает, что приложения, сделанные в этом размере, отлично отображаются в разрешении 720 × 1280 и выглядят более четкими в разрешении 1080 × 1920, а экономичное означает, что изображения, экспортируемые в этом разрешении, имеют умеренный размер и занимают внутреннюю память. Он не будет слишком высоким, размер файла образа будет умеренным, а установочный пакет не будет слишком большим, расчет прост, то есть 1dp = 2px, насколько это хорошо!
Созданное изображение, не забудьте позволить разработчику интерфейса поместить его в папку ресурсов drawable-xhdpi.
6. Разница в ширине и высоте экрана
При рисовании в формате 720 × 1280 необходимо учитывать обратную совместимость с различными экранами. Посредством вычислений мы можем узнать, что ширина экрана 320 × 480 и 480 × 800 равна 320 dp, тогда как ширина экрана 720 × 1280 и 1080 × 1920 составляет 360 dp. Между ними разрыв в 40dp, и это 40dp оказывает большое влияние на дизайн. Как показано ниже, левые и правые поля изображения бабочки с экрана отличаются на экране шириной 320dp и на экране 360dp.
Различия не только в ширине, но и в высоте еще более выражены. Для приложений погоды и других инструментов, поскольку интерфейс, как правило, является эксклюзивным, необходимо учитывать разницу между экранами
Если вы хотите устранить эти различия в пропорциях, вы можете сделать это, добавив файл макета. Обычно файл макета помещается в папку макета. Если вы хотите настроить экран 360dp отдельно, вы можете просто создать файл макета и поместить его в layout-w360dp, если вы хотите настроить конкретное разрешение. , Затем вы можете поместить файл макета в папку с разрешением, например layout-854 × 480.
7, несколько папок ресурсов
Я сделал изображение в разрешении 720 × 1280. Пусть разработчик поместит его в папку ресурсов drawable-xhdpi, чтобы оно могло отображаться правильно. Лично я думаю, что достаточно предоставить только один набор материалов. Вы можете проверить, нормально ли работает приложение на недорогих телефонах. Если оно зависло, вы можете при необходимости предоставить некоторые графические материалы с разрешением mdpi, поскольку изображения в формате xhdpi запускаются на телефонах с разрешением mdpi. Займет больше памяти.
Возьмите значок приложения в качестве примера. Размер значка в xhdpi составляет 96 пикселей. Если вы хотите предоставить значок для mdpi отдельно, то размер значка составляет 48 пикселей и помещается в папку ресурсов drawable-mdpi. Размер изображений в каждой папке ресурсов также соответствует закону ldpi: mdpi: hdpi: xhdpi: xxhdpi = 3: 4: 6: 8: 12.
Что делать, если вы сделали изображение в формате 9.png с материалом с высокой разделительной линией 2px и хотите, чтобы тонкие линии были 2px с различной плотностью без масштабирования Android на основе плотности? Вы можете поместить этот разделенный секущий материал в drawable-nodpi. Изображения в этой папке ресурсов будут отображаться в соответствии с фактическим размером пикселя и не будут масштабироваться Android в зависимости от плотности. То есть тонкая линия в mdpi составляет 2px (2dp), а тонкая линия в xhdpi — 2px (1dp).
Выше приведено предварительное резюме экрана Android. Я не знаю, внезапно ли вы почувствовали яркость после прочтения или вы запутались? Эта статья в основном для практических целей, избегая слишком глубокого анализа, если у вас есть какие-либо вопросы, вы можете оставить сообщение.
Источник