- Единицы измерения
- Переводим dp в пиксели
- Настройка шрифтов
- Используем стандартные системные размеры шрифтов
- Русские Блоги
- Решение для адаптации экрана Android
- Зачем адаптировать
- Основные понятия
- 5. Плотность независимых пикселей (dp):
- 6. Независимая шкала пикселей (sp):
- 7. Разница между sp и dp:
- Схема адаптации
- резюме
Единицы измерения
Исторически так сложилось, что разработчики всегда использовали пиксели при создании компьютерных интерфейсов. Но с развитием технологий данный подход стал источником проблем — на многих новых дисплеях элементы стали очень мелкими при установленных высоких разрешениях. Поэтому стали появляться новые единицы измерения, не зависящие от разрешения экрана.
Android поддерживает несколько стандартных единиц измерения. Вкратце перечислим их.
- px (pixels) — пиксели. Точки на экране — минимальные единицы измерения;
- dp (density-independent pixels) — независимые от плотности пиксели. Абстрактная единица измерения, основанная на физической плотности экрана с разрешением 160 dpi. В этом случае 1dp = 1px;
- dip — синоним для dp. Иногда используется в примерах Google;
- sp (scale-independent pixels) — независимые от масштабирования пиксели. Допускают настройку размеров, производимую пользователем. Полезны при работе с шрифтами;
- in (inches) — дюймы, базируются на физических размерах экрана. Можно измерить обычной линейкой;
- mm (millimeters) — миллиметры, базируются на физических размерах экрана. Можно измерить обычной линейкой;
- pt (points) — 1/72 дюйма, базируются на физических размерах экрана;
Как правило, при установке размера текста используются единицы измерения sp, которые наиболее корректно отображают шрифты:
В остальных случаях рекомендуется использовать dp.
Переводим dp в пиксели
Так как на разных устройствах dp может различаться, то для получения величин в пикселях и наоборот используйте методы (float):
Часто точность не требуется и можно использовать целые числа int. Напишем аналогичные методы.
На Kotlin можно написать функцию-расширение:
Если вы не определили размеры в XML, то их можно задать программно с помощью следующего кода (устанавливаем отступы для компонента):
Настройка шрифтов
Давайте чуть подробнее поговорим о работе со шрифтами, чтобы лучше понять специфику работы с текстами. Все люди разные — у кого-то зрение хорошое, у кого-то плохое. Android позволяет в настройках задать размеры шрифта в четырёх вариантах: Мелкий, Обычный, Крупный, Огромный. Для этого нужно зайти в Настройки | Экран | Размер шрифта.
Можно узнать программно выбранный вариант через свойство fontScale:
Обычному шрифту соответствует значение 1, мелкому — 0.9, крупному — 1.1, огромному — 1.15.
Если вы хотите, чтобы ваш текст мог меняться в зависимости от выбора пользователя, то используйте единицы измерения SP:
В тех случаях, когда изменять текст по желанию пользователя не следует, но при этом текст должен отображаться корректно в зависимости от разрешения экрана устройства, то используйте единицы измерения DP.
Третий вариант — если вы ни при каких обстоятельствах (какой же вы упрямый) не хотите зависеть от предпочтений пользователя и разрешения экрана, то пользуйтесь PX (пиксели). Среда разработки будет сопротивляться вашему желанию и выводить предупреждающие сообщения. Подумайте ещё раз о своём решении.
Используем стандартные системные размеры шрифтов
В Android зашиты три системный размера шрифтов, основанных на SP: Small, Medium и Large. Вы можете использовать их в стандартных случаях, когда вам не нужно задавать конкретные значения (атрибут style):
На самом деле стилей @android:style/TextAppearance.* гораздо больше. Если вы вдруг забыли про названия стилей, то можете использовать встроенные возможности среды разработки. На панели инструментов виджет TextView представлен в четырёх вариантах: TextView, Large, Medium, Small, и в них используется атрибут android:textAppearance.
Создадим проект со всеми возможными вариантами и посмотрим на результат. В первом случае будем использовать стандартные настройки шрифта, во втором — увеличим его.
Источник
Русские Блоги
Решение для адаптации экрана Android
Зачем адаптировать
Благодаря открытости системы Android любой пользователь, разработчик, производитель оборудования или оператор может настроить систему и оборудование Android и изменить ее так, как они хотят. Так в какой степени эта «фрагментация» достигает?
Каждый из вышеперечисленных прямоугольников представляет модель, и их размеры и разрешение экрана весьма различны. С ростом количества устройств Android также возрастают степень фрагментации устройств, фрагментации системы, фрагментации размера экрана и фрагментации экрана.
Примечания:
Фрагментация системы Android: на основе собственной системы Google, настроенного MIUI MIUI, настраиваемого flyme Meizu, настроенного EMUI Huawei и т. Д .;
Размер экрана у моделей Android фрагментирован: 5 дюймов, 5,5 дюйма, 6 дюймов и т. Д .;
Фрагментация разрешения экрана Android: 320х480, 480х800, 720х1280, 1080х1920 и т.д .;
Когда система Android, размер экрана и плотность экрана фрагментированы, один и тот же элемент может легко отображать различные проблемы на разных мобильных телефонах. Представьте себе сценарий, когда чертеж дизайна пользовательского интерфейса для 4,3-дюймового экрана выполняется на 5,0-дюймовом экране, и, вероятно, на правой и нижней сторонах будет много пустого пространства, а чертеж дизайна пользовательского интерфейса 5,0 — на 4,3-дюймовом устройстве. Вверх, это может не отображаться.
Чтобы гарантировать, что пользователи получают единообразное взаимодействие с пользователем, элемент имеет одинаковый эффект отображения на мобильных телефонах с разными размерами, различными разрешениями и разными системами на Android и может поддерживать одинаковый эффект на интерфейсе. адаптация!
Основные понятия
1. Пиксель (пикс):
Значение: обычно упоминаемые пиксели — это количество фотоэлектрических чувствительных элементов в CCD / CMOS. После того, как светочувствительный элемент проходит этапы измерения света, преобразования фотоэлектрического сигнала, аналого-цифрового преобразования и т. Д., На выходной фотографии формируется точка. Когда изображение будет увеличено в несколько раз, вы обнаружите, что эти непрерывные тона на самом деле состоят из множества маленьких квадратных точек с одинаковыми цветами. Короче,Пиксель — самая маленькая единица экрана мобильного телефона.。
Единица измерения: px (пиксель), 1px = 1 пиксель. В нормальных условиях дизайн конструктора пользовательского интерфейса будет использовать px в качестве единицы измерения.
2. Разрешение:
Значение: сумма количества пикселей мобильного телефона в горизонтальном и вертикальном направлениях обычно описывается как ширина * высота, то есть количество горизонтальных пикселей * количество вертикальных пикселей (например, 1080 x 1920).
Единица измерения: пиксель (пиксель), 1 пиксель = 1 пиксель
3. Размер экрана (в):
Значение: диагональ телефонаФизический размер
Единица дюйма (дюйма), один дюйм составляет около 2,54 см. Общие размеры 4,7 дюйма, 5 дюймов, 5,5 дюйма, 6 дюймов
4. Плотность пикселей экрана (dpi):
Значение: пикселей на дюйм. Например, если есть 160 пикселей на дюйм, плотность пикселей составляет 160 точек на дюйм.
Единица измерения: точки на дюйм (точек на дюйм)
Расчетная формула:Плотность пикселей = пикселей / размер (dpi = px / in)
Стандартная плотность пикселей на экране (мдпи): на дюйм приходится 160 пикселей (160 точек на дюйм), что называется стандартной плотностью пикселей на экране (мдпи).
Соотношение между размером экрана, разрешением и плотностью пикселей
Разрешение мобильного телефона — ширина х высота, размер экрана в дюймах, а затем соотношение между ними:
Предположим, что разрешение мобильного телефона составляет 1080×1920 (px), а размер экрана составляет 5 дюймов.
5. Плотность независимых пикселей (dp):
Значение: независимый от плотности пиксель, называемый dp или dip, не имеет ничего общего с фактическим физическим пикселем на терминале
Единица измерения: dp, которая может гарантировать тот же эффект на устройствах с разной плотностью пикселей экрана, является уникальной единицей длины Android.
Пример сценария: если вы также рисуете линию, которая составляет половину длины экрана, если вы используете px в качестве единицы измерения, тогда значение должно быть 240px для телефона с разрешением 480×800, 160px для телефона 320×480, эти два параметра отличаются Если вы используете dp в качестве устройства, при этих двух разрешениях 160dp отображается как половина длины экрана.
Преобразование dp и px: 1dp = (dpi / 160) * 1px;
6. Независимая шкала пикселей (sp):
Значение: независимый от масштаба пиксель, называемый sp или sip
Единица измерения: sp, специальная единица измерения размера шрифта. Эта единица измерения используется для установки размера текста во время разработки под Android. Его можно масштабировать в соответствии с предпочтением размера шрифта; 12sp, 14sp, 18sp и 22sp рекомендуются в качестве размеров шрифта, а нечетные и десятичные числа не рекомендуются, что легко обеспечить точность Отсутствует, шрифты до 12sp слишком малы.
7. Разница между sp и dp:
dp относится только к плотности пикселей на экране;
sp и dp очень похожи, но единственное отличие состоит в том, что система Android позволяет пользователю настраивать размер текста (маленький, нормальный, большой, супер большой и т. д.), когда размер текста «нормальный» 1sp = 1dp = 0,00625 дюймов, и когда текст Когда размер «большой» или «очень большой», 1sp> 1dp = 0,00625 дюймов. По аналогии с эффектом, который мы имеем после настройки размера шрифта в окнах, размер окна не меняется, меняется только размер текста.
Переходя к исходному коду Android, обнаруживается, что система использует applyDimension () (путь: android.util.TypedValue.applyDimension ()), чтобы преобразовать все единицы в px, а затем обработать:
Схема адаптации
Суть проблемы адаптации экрана заключается в том, чтобы компоновка и компоненты макета имели одинаковый эффект отображения на телефонах Android разных размеров и разного разрешения. Я расскажу о том, как выполнить адаптацию в нескольких аспектах.
3.1 Об адаптации компоновки компонентов:
3.1.1 Задание размеров с использованием независимых от плотности пикселей
Поскольку плотность пикселей на разных экранах различна, фактический размер одного и того же количества пикселей на разных устройствах также будет разным, поэтому для определения размера макета используйте пиксели (px). Вызовет проблемы. Поэтому обязательно указывайте размер в единицах плотности, не зависящих от плотности пикселей или независимых масштабов пикселей sp.
Примечания. В ходе производственного процесса производители не будут полностью производить устройства Android в соответствии со стандартом плотности экрана, будут использовать стандарт Google или отклоняться от стандарта плотности экрана Google, В сочетании с ошибкой, вызванной теоретическим расчетом (предписанием), фактически использование dp в качестве единицы не может завершить операцию адаптации полностью;
3.1.2 Используйте относительную или линейную компоновку, не используйте абсолютную компоновку
Для линейного макета (Linearlayout) необходимо выбрать относительный макет (RelativeLayout), макет кадра (FrameLayout), абсолютный макет (AbsoluteLayout) и новый улучшенный макет кадра (CoordinatorLayout) в соответствии с потребностями. Не совсем.
Но поскольку RelativeLayout обращает внимание на относительную позицию, даже если размер экрана изменяется, относительная позиция перед видом не изменится, независимо от размера экрана, гибкость очень высока, а метод LinearLayout точно Управление позиционными отношениями между подпредставлениями может быть организовано только один за другим, поэтому для адаптации экрана лучше использовать относительную компоновку (RelativeLayout), так как для абсолютной компоновки из-за адаптации Секс очень беден, поэтому он редко используется.
3.1.3 Использовать wrap_content, match_parent, weight
Используйте значения размера «wrap_content» и «match_parent» вместо жестко заданных размеров, система автоматически вычислит соответствующие значения, а представление будет использовать необходимое пространство или соответственно заполнит доступное пространство Пространство, пусть макет правильно адаптируется к разным размерам экрана и ориентации экрана, а весовое соотношение компонентов одинаково.
3.1.4 Используйте такие атрибуты, как minWidth, minHeight, линии и т. Д.
Много раз отображаемые нами данные возвращаются фоном, а затем обрабатываются нами для адаптации к нашим компонентам, длину этих данных мы не можем определить, и при нормальных обстоятельствах Заданные нами макеты подходят только для идеальных ситуаций. Чтобы обеспечить выравнивание интерфейса, отображение данных завершено и т. Д. При создании макета нам необходимо увеличить минимальную ширину, высоту, количество линий и другие свойства компонентов. Специальные данные не разрушат нашу общую структуру.
3.1.5 Использование размеров
Длина и ширина компонента могут быть определены размерами, разные размеры экрана могут определять разные значения или на разных языках отображаться, мы также можем определять разные значения, потому что переведенная длина Как правило, он не будет таким же, как китайский.
3.2 Адаптация макета:
Вышеупомянутые несколько способов могут решить проблему адаптивности экрана, но те, которые используют гибкие средства управления для адаптации к разным размерам экрана, могут не обеспечивать наилучшего пользовательского опыта. Ваше приложение должно не только реализовывать адаптивные макеты, но также предоставлять некоторые решения для загрузки различных макетов в соответствии с конфигурацией экрана, что может быть достигнуто с помощью квалификаторов конфигурации. Спецификатор конфигурации позволяет программе автоматически загружать соответствующие ресурсы в соответствии с текущей конфигурацией устройства во время выполнения (например, проектирование различных макетов для экранов разных размеров).
3.2.1 Использование классификатора размера
Многие приложения реализуют режим «двойной панели» на большом экране, то есть отображают список элементов на одной панели и отображают соответствующий контент на другой панели. Экраны планшетных компьютеров и телевизоров достаточно велики для размещения обеих панелей, но экраны мобильных телефонов необходимо отображать отдельно. Поэтому мы можем использовать следующие файлы для реализации этих макетов:
Обратите внимание на большой спецификатор во втором каталоге имен макетов. Этот макет будет выбран на устройствах, которые относятся к большим экранам (например, 7-дюймовые или более крупные планшеты). Система выберет другой макет (без классификатора) на меньшем экране.
3.2.2 Спецификатор минимальной ширины
Существует проблема с классификатором размера, которая вызовет головную боль у многих программистов. Насколько она велика? Многие приложения хотят иметь возможность загружать разные макеты для разных экранных устройств более свободно, независимо от того, распознаются ли они как «большие» системой. Вот почему Android представила классификатор «Smallest-width» после 3.2.
Спецификатор минимальной ширины позволяет расположить экран, указав минимальную ширину (в dp). Например, стандартный 7-дюймовый планшет имеет минимальную ширину 600 точек на дюйм, поэтому, если вы хотите использовать двойную панель в пользовательском интерфейсе на таких экранах (но отображать список только на меньших экранах), вы можете использовать Однопанельные и двухпанельные макеты, но вы должны использовать sw600dp, чтобы указать, что двухпанельная компоновка применима только к экранам с минимальной шириной 600 dp, вместо использования спецификатора большого размера.
Другими словами, для устройств с минимальной шириной, превышающей или равной 600 dp, система выберет layout-sw600dp / main.xml (двухпанельная) layout, в противном случае система выберет layout / main.xml (однопанельная) layout.
Однако устройства с версиями Android ниже 3.2 не поддерживают эту технологию, поскольку эти устройства не могут распознать sw600dp в качестве квалификатора размера, поэтому нам все еще нужно использовать большой спецификатор. В результате появится файл с именем res / layout-large / main.xml (такой же, как res / layout-sw600dp / main.xml). Но это не имеет большого значения, мы узнаем, как немедленно избежать дублирования таких файлов макета.
3.2.3 Использование псевдонимов макета
Спецификатор минимальной ширины доступен только для Android 3.2 и выше. Поэтому, если нам все еще нужно использовать обобщенный диапазон размеров (маленький, нормальный, большой и очень большой), совместимый с более низкой версией. Например, если пользовательский интерфейс предназначен для отображения одной панели на мобильном телефоне, но отображает несколько панелей на 7-дюймовом планшете, телевизоре и других более крупных устройствах, то нам необходимо предоставить следующие файлы:
res / layout / main.xml: однопанельный макет res / layout-large: многопанельный макет res / layout-sw600dp: мультипанельный макет
Последние два файла одинаковы, поскольку один предназначен для устройств Android 3.2, а другой — для планшетов и телевизоров с более низкими версиями Android.
Чтобы избежать дублирования файлов на планшетах и телевизорах (и возникающих в результате проблем с обслуживанием), вы можете использовать псевдонимы файлов. Например, вы можете определить следующий макет:
res / layout / main.xml, однопанельная компоновка
res / layout / main_twopanes.xml, двойная панель
Затем добавьте эти два файла:
res/values-large/layout.xml:
res/values-sw600dp/layout.xml:
Содержимое последних двух файлов одинаковое, но они фактически не определяют макет. Они просто устанавливают main для псевдонима main_twopanes. Поскольку эти файлы содержат большой селектор и селекторы sw600dp, они будут применяться к планшетам и телевизорам независимо от версии Android (планшеты и телевизоры ниже версии 3.2 будут соответствовать большим, планшеты и версии выше 3.2 и ТВ будет соответствовать sw600dp).
3.2.4 Использовать классификатор ориентации экрана
Некоторые макеты будут поддерживать как альбомный, так и портретный режимы, но мы можем оптимизировать эффекты большинства из них путем настройки. В примере приложения для чтения новостей поведение макета для каждого размера экрана и ориентации экрана выглядит следующим образом:
Маленький экран, портрет: одна панель с логотипом
Маленький экран, пейзаж: одна панель, с логотипом
7-дюймовый планшет, портрет: одна панель, с панелью управления
7-дюймовый планшет, пейзаж: двусторонний, широкий, с панелью управления
10-дюймовый планшет, портрет: двусторонний, узкий, с панелью управления
10-дюймовый планшет, альбомная ориентация: двойная панель, широкая, с панелью управления
Телевизор, пейзаж: двойной, широкий, с панелью управления
Поэтому каждый из этих макетов определяется в файле XML в каталоге res / layout /. Чтобы по-прежнему назначать каждый макет различным настройкам экрана, приложение использует псевдонимы макетов для соответствия двум:
res / layout / onepane.xml: (одна панель)
res / layout / onepane_with_bar.xml: (отдельная панель с панелью операций)
res / layout / twopanes.xml: (двойная панель, широкая компоновка)
res / layout / twopanes_narrow.xml: (двойная панель, узкая схема)
Теперь, когда мы определили все возможные макеты, мы просто используем спецификатор конфигурации для сопоставления правильного макета с различными конфигурациями.
Теперь вы можете сделать это, просто используя методы псевдонимов:
3.2.5 Несколько наборов адаптации макета
res/values/layouts.xml: res/values-sw600dp-land/layouts.xml: res/values-sw600dp-port/layouts.xml: res/values-large-land/layouts.xml: res/values-large-port/layouts.xml:
3.3 Об адаптации изображения:
3.3.1 Значок ЛОГОТИП
Рекомендуется подготовить все значки в соответствии с официальными стандартами;
3.3.2 Общие картинки и значки
Рекомендуется установить официальный тип плотности для резки, но обычно нам требуется только резка xxhdpi или xxxhdpi для удовлетворения наших потребностей;
3.3.3 Автоматическое растягивание растрового изображения: тип изображения Nine-Patch
Поддержка разных размеров экрана обычно также означает, что ресурсы изображения также должны быть адаптивными. Например, фоновое изображение кнопки должно меняться при изменении размера кнопки. Если вы хотите использовать обычные снимки для выполнения вышеуказанных функций, вам будет трудно это сделать, потому что ваши снимки будут равномерно растягиваться или сжиматься во время выполнения. Решение состоит в том, чтобы использовать изображение из девяти пятен, которое является специально обработанным изображением PNG. Вы можете указать, какие области можно растягивать, а какие — нет.
3.3.4 Анимация, пользовательский вид, форма
Вы можете использовать код для управления и отображения нескольких представлений, таких как анимация патчей вместо анимации кадров.
3.3.5 Адаптация ScaleType для ImageView
android: scaleType = «center» сохраняет размер исходного изображения и отображает его в центре ImageView. Когда размер исходного изображения больше, чем размер ImageView, лишняя часть обрезается.
android: scaleType = «center_inside» В целях обычного отображения исходного изображения, если размер исходного изображения больше размера ImageView, ширина и высота исходного изображения будут уменьшены в соответствии с пропорцией и будут отображаться в центре в ImageView. Если размер исходного изображения меньше размера ImageView, изображение будет отображаться в центре без обработки.
android: scaleType = «center_crop» Чтобы заполнить ImageView исходным изображением, если размер исходного изображения больше размера ImageView, он будет уменьшен, как center_inside, и отобразится в центре ImageView. Если размер исходного изображения меньше размера ImageView, ширина и высота исходного изображения увеличиваются, чтобы заполнить ImageView и отобразить в центре.
android: scaleType = «matrix» Не изменяет размер исходного изображения, рисование начинается с верхнего левого угла ImageView, а лишняя часть обрезается.
androd: scaleType = «fit_xy» отображает изображение в ImageView в соответствии с указанным размером, растягивает отображаемое изображение, не поддерживает исходный масштаб и заполняет ImageView.
android: scaleType = «fit_start» Исходное изображение масштабируется вверх и вниз до высоты ImageView и отображается в начале (спереди / сверху) ImageView.
android: sacleType = «fit_center» Исходное изображение масштабируется вверх и вниз до высоты ImageView и отображается в центре ImageView (средний / центральный дисплей).
android: scaleType = «fit_end» масштабирует исходное изображение до высоты ImageView в соответствии с масштабом и отображает его в конце (сзади / сзади / снизу) ImageVIew
3.4 Об адаптации кода:
Используйте API, предоставленный Google, чтобы измерить ширину экрана устройства в коде, а затем установите его, как требуется.
Для настроек ширины и высоты текущего элемента управления, первое, что вам нужно сделать, это получить родительский элемент управления и использовать родительский элемент управления, чтобы установить ширину и высоту текущего элемента управления!
В приведенных выше двух расчетных операциях эффект добавления 0,5f в конце таков: когда тип float принудительно переводится в тип int, возникают проблемы с точностью. При использовании кода Java для установки ширины и высоты, если появляются такие данные, как 320.2dp, значение, полученное напрямую через int, равно 320, но если появляются такие данные, как 320.7, из-за правил вычисления int, они будут напрямую преобразованы в 320, но с практической точки зрения значение 321 в это время является более подходящим.
Таким образом, в конце вычисления добавьте 0,5 напрямую. Таким образом, 320,2 + 0,5 = 320,7, данные, полученные с помощью операции принудительного преобразования, равны 320, 320,7 + 0,5 = 321,2, а данные, полученные с помощью операции принудительного преобразования, равны 321, например, Полученные данные ближе к тому, что на самом деле ожидается! !
3.5 О согласовании интерфейса:
Перед локальной загрузкой изображений определите разрешение или плотность пикселей мобильного телефона и запросите изображения соответствующего уровня с сервера.
резюме
После вышеприведенного введения, я считаю, что у каждого есть определенное понимание адаптации экрана, но на самом деле мы не будем в полной мере выполнять все вышеперечисленные операции, но нам нужно выбрать наиболее подходящий метод в соответствии с нашим проектом необходимо адаптировать с. Например, если ваш продукт предназначен для пожилых людей, использует ли ваш модуль шрифтов sp или dp? Другим примером является то, что RelativeLayout и веса могут лучше решить проблему адаптации, но на самом деле они потребляют больше производительности, как измерить производительность и степень адаптации? Знания мертвы, люди живы, а способность гибко использовать соответствующие знания показывает истинные навыки.
Источник