Я пытаюсь загрузить некоторые изображения на основе атрибута наименьшей ширины. Для этого я помещал изображения в следующие папки:
drawable-sw320dp drawable-sw360dp drawable-sw480dp drawable-sw600dp drawable-sw720dp
Но мне интересно, какой минимальный размер должен быть во избежание сбоев во время выполнения. Что произойдет, если устройство (если оно существует) с наименьшей шириной 240 запускает мое приложение (возможно, он сбой во время выполнения)? Могу ли я создать папку с именем
drawable-sw0dp
и поместите в него несколько изображений, чтобы, если атрибут наименьшей ширины находится между 0 и 320, эти изображения загружаются?
Я могу сделать это программно следующим образом, но мне интересно, могу ли я сделать это без необходимости писать код.
DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int widthPixels = metrics.widthPixels; int heightPixels = metrics.heightPixels; float scaleFactor = metrics.density; float widthDp = widthPixels / scaleFactor; float heightDp = heightPixels / scaleFactor; float smallestWidth = Math.min(widthDp, heightDp); if (smallestWidth < 320) < //Load necessary images >else if (smallestWidth >= 320 smallestWidth < 360) < //Load necessary images >else if (smallestWidth >= 360 smallestWidth < 480) < //Load necessary images >else if (smallestWidth >= 480 smallestWidth < 600) < //Load necessary images >else if (smallestWidth >= 720) < //Load necessary images >
Лучший ответ:
Как изменить DPI на любом телефоне Андроид?
Я понял, что папка drawable-sw320dp бесполезна. Я помещал изображения в папки с возможностью рисования и drawable-sw320dp и запускал их на устройстве с наименьшей шириной 320 дп. Система загружает изображения из папки с возможностью перемещения, а не в папку drawable-sw320dp. Таким образом, похоже, что 320dp – это минимально возможная ширина в android, и вам нужно поместить изображения в папку для переноски для этих устройств.
Вы должны классифицировать изображения на основе плотности экрана. Не
на основе ширины экрана.
Существует несколько типов плотности экрана: –
ldpi ~ 120dpi
mdpi ~ 160dpi
hdpi ~ 240dpi
xhdpi ~ 320dpi
xxhdpi ~ 480dpi
xxxhdpi ~ 640 dpi
Каждое устройство классифицируется только между ними.
Их папки похожи на: –
вытяжка-ldpi
вытяжка-MDPI
вытяжка-ИПЧР
вытяжка-xhdpi
вытяжка-xxhdpi
вытяжка-xxxhdpi
Изображения для наименьшей плотности экрана в ldpi.
Изображения для наибольшей плотности экрана в xxxhdpi.
Другие вещи будут управляться самим андроидом. Он загрузит правильное изображение в зависимости от плотности экрана
Всегда помните, что mdpi называется базовой линией. Это соотношение 1:1, означает в mdpi, 1 px = 1dp.
Вам нужно поместить ваши другие файлы изображений в свою папку. Нет необходимости создавать папку sw0dp, она будет проигнорирована.
Как найти ДПИ на Xiaomi — Минимальная Ширина
drawable-sw0dp – это допустимое имя папки для ресурсов Android, так что да, вы можете разместить там свои ресурсы, и они будут предпочтительнее ресурсов с таким же именем в папке drawable , как в . Поскольку все устройства Android имеют наименьшую ширину, равную или большую, чем 0, селектор sw0dp будет не исключать любые из них.
Итак, зачем использовать папку drawable-sw0dp и почему не просто drawable один? Предположим, что у вас есть проект для смартфонов и планшетов с некоторыми ресурсами, а некоторые нет. Вы можете поместить все общие ресурсы в папку drawable и все “конкретные” ресурсы в папках drawable-sw0dp (для смартфонов) и drawable-sw600dp (для таблиц). Таким образом, вы можете легко проверить, содержит ли эти две папки одинаковое количество файлов и с теми же именами, и четко видеть, какие ресурсы являются “универсальными”, а какие нет.
В заключение, это только вопрос удобочитаемости. Все будет работать одинаково, если вы поместите все “универсальные” и мультимедийные ресурсы в папку drawable и планшеты в папку drawable-sw600dp (это более интуитивно понятный подход), так что это действительно зависит от вас.
Источник: techarks.ru
Поддержка разных размеров экрана при разработке android приложений
В этом уроке рассказывается, как создать макет, который адаптируется к разным размерам экрана, используя масштабируемые представления, объекты RelativeLayout , квалификаторы размера и ориентации, фильтры псевдонимов и растровые изображений формата nine-patch.
Код, приведенный в уроке, взят из учебного приложения, в котором демонстрируются способы оптимизации для разных экранов. Вы можете загрузить его здесь и использовать части кода в собственном приложении.
В этом уроке описаны следующие аспекты обеспечения совместимости интерфейса с разными экранами:
- обеспечение способности макета адаптироваться к размеру экрана;
- выбор макета интерфейса, отвечающего конфигурации экрана;
- контроль правильности применяемого макета;
- использование масштабируемых растровых изображений.
Использование параметров wrap_content и match_parent
Если указать параметры «wrap_content» и «match_parent» вместо строго заданных размеров, в представлениях будет использоваться минимально необходимое место или они будут растягиваться на всю доступную длину и ширину соответственно. Например:
Обратите внимание на то, что в коде учебного приложения размеры компонентов заданы с помощью параметров «wrap_content» и «match_parent» . В результате макет правильно отображается на экранах разных размеров при разных ориентациях.
Например, вот так он выглядит в вертикальной и горизонтальной ориентациях. Обратите внимание на то, как размеры компонентов автоматически адаптируются к длине и ширине:
Рисунок 1. Приложение News Reader при вертикальной (слева) и горизонтальной (справа) ориентации.
Использование объекта RelativeLayout
С помощью вложенных экземпляров объекта LinearLayout и параметров «wrap_content» и «match_parent» можно создавать достаточно сложные макеты. Однако LinearLayout не дает возможности точно управлять взаимным расположением дочерних представлений: в LinearLayout они просто помещаются в ряд друг за другом. Если необходимо расположить дочерние представления иным образом, используйте объект RelativeLayout , позволяющий задать относительные позиции компонентов. Например, одно дочернее представление можно выровнять по левому краю экрана, а другое – по правому.
На рис. 2 показано, как этот макет выглядит на экране QVGA.
Рисунок 2. Скриншот экрана QVGA (маленького размера).
На рис. 3 показано, как он выглядит на экране с большей диагональю.
Рисунок 3. Скриншот экрана WSVGA (большего размера).
Обратите внимание: несмотря на изменение размера компонентов их взаимное расположение остается прежним, так как оно задано объектом RelativeLayout.LayoutParams .
Использование квалификаторов размера
Масштабируемые или относительные макеты, один из которых продемонстрирован выше, имеют свои ограничения. Хотя они позволяют создать интерфейс, способный адаптироваться к разным экранам за счет растягивания пространства внутри и вокруг компонентов, пользователю может оказаться не слишком удобно работать с таким интерфейсом. Поэтому в приложении должен использоваться не один масштабируемый макет, а несколько альтернативных вариантов для разных конфигураций экрана. Их можно создать с помощью квалификаторов конфигураций, которые позволяют оперативно выбирать ресурсы, отвечающие текущим параметрам экрана (например, разные варианты макетов для экранов разных размеров).
-
res/layout/main.xml , однопанельный макет (по умолчанию):
Обратите внимание, что во втором случае в названии каталога использован квалификатор large . Этот макет будет выбран на устройствах, экраны которых считаются большими (например, 7 дюймов и более). Первый макет (без квалификаторов) будет выбран для устройств с маленьким экраном.
Использование квалификатора Smallest-width
Одной из проблем, с которой сталкивались разработчики приложений для устройств Android версий до 3.2, было слишком общее определение “большого” экрана. Это касалось устройств Dell Streak, первой модели Galaxy Tab и планшетных ПК с экраном размером 7 дюймов. Многие приложения требовалось по-разному отображать на разных устройствах (например, с 5- и 7-дюймовыми экранами), хотя они и относились к одной категории “больших” экранов. В Android версии 3.2 и более поздних доступен квалификатор Smallest-width.
Он позволяет определять экраны с заданной минимальной шириной в dp. Например, типичный планшетный ПК с экраном 7 дюймов имеет минимальную ширину 600 dp, и если вы хотите, чтобы приложение работало на нем в двухпанельном режиме (а на меньших экранах в однопанельном), используйте два макета из предыдущего раздела, но вместо квалификатора размера large укажите sw600dp . В таком случае на экранах, минимальная ширина которых составляет 600 dp, будет использоваться двухпанельный макет.
-
res/layout/main.xml , однопанельный макет (по умолчанию):
Это означает, что на устройствах, минимальная ширина экрана которых не меньше 600 dp, будет выбран layout-sw600dp/main.xml (двухпанельный макет), а на экранах меньшего размера – layout/main.xml (однопанельный макет).
Следует учесть, что на Android-устройствах до версии 3.2 квалификатор sw600dp не будет работать, поэтому для них по-прежнему нужно использовать large . Таким образом, вам потребуется еще один файл с названием res/layout-large/main.xml , идентичный файлу res/layout-sw600dp/main.xml . В следующем разделе вы познакомитесь с методом, который позволяет избежать дублирования таких файлов макета.
Использование псевдонимов макетов
Квалификатор Smallest-width работает только на устройствах Android 3.2 или более поздних версий. Для совместимости с более ранними устройствами по-прежнему следует использовать абстрактные размеры (small, normal, large и xlarge). Например, чтобы интерфейс открывался в однопанельном режиме на телефонах и в многопанельном на планшетных ПК с 7-дюймовым экраном, телевизорах и других крупных устройствах, подготовьте следующие файлы:
- res/layout/main.xml: однопанельный макет;
- res/layout-large: многопанельный макет;
- res/layout-sw600dp: многопанельный макет.
Последние два файла идентичны: один из них предназначен для устройств Android 3.2 и новее, а второй для более старых планшетных ПК и телевизоров на платформе Android.
Чтобы не создавать дубликаты файлов и упростить процесс поддержки приложения, используйте псевдонимы. Например, можно определить следующие макеты:
- res/layout/main.xml (однопанельный макет);
- res/layout/main_twopanes.xml (двухпанельный макет).
Затем добавьте следующие два файла:
Содержание последних двух файлов одинаково, но сами по себе они не определяют макет. Они служат для того, чтобы назначить файл main в качестве псевдонима main_twopanes . Так как в них используются селекторы large и sw600dp , они применяются к планшетным ПК и телевизорам на платформе Android независимо от версии (для версий до 3.2 используется large , а для более новых – sw600dp ).
Использование квалификаторов ориентации
Хотя некоторые макеты одинаково хорошо смотрятся в вертикальной и горизонтальной ориентациях, в большинстве случаев интерфейс все же приходится адаптировать. Ниже показано, как изменяется макет в приложении News Reader в зависимости от размера и ориентации экрана.
- Маленький экран, вертикальная ориентация: однопанельный вид с логотипом.
- Маленький экран, горизонтальная ориентация: однопанельный вид с логотипом.
- Планшетный ПК с 7-дюймовым экраном, вертикальная ориентация: однопанельный вид с панелью действий.
- Планшетный ПК с 7-дюймовым экраном, горизонтальная ориентация: двухпанельный вид с панелью действий.
- Планшетный ПК с 10-дюймовым экраном, вертикальная ориентация: двухпанельный вид (узкий вариант) с панелью действий.
- Планшетный ПК с 10-дюймовым экраном, горизонтальная ориентация: двухпанельный вид (широкий вариант) с панелью действий.
- Телевизор, горизонтальная ориентация: двухпанельный вид с панелью действий.
Каждый из этих макетов определен в XML-файле в каталоге res/layout/ . Чтобы сопоставить их с определенными конфигурациями экрана, в приложении используются псевдонимы:
После того как все возможные макеты определены, остается сопоставить каждый из них с подходящей конфигурацией, используя квалификаторы конфигураций. Воспользуемся псевдонимами макетов:
Использование растровых изображений nine-patch
Чтобы интерфейс был совместим с экранами разных размеров, используемые в нем графические элементы также должны быть адаптированы соответствующим образом. Например, фон кнопки должен одинаково хорошо выглядеть независимо от ее формы.
Если использовать для компонентов, размеры которых меняются, обычные изображения, то они будут равномерно сжиматься и растягиваться, и результат будет далек от идеального. Решением являются растровые изображения формата nine-patch – специальные PNG-файлы, содержащие информацию о том, какие области можно растягивать, а какие нет.
Создавая растровые изображения для масштабируемых компонентов, обязательно используйте формат nine-patch. На рис. 4 показано обычное растровое изображение (увеличенное в 4 раза для наглядности), которое мы переведем в формат nine-patch.
Рисунок 4. button.png
Рисунок 5. button.9.png
Также обратите внимание на расширение .9.png . Оно должно быть задано именно в таком виде, чтобы система могла определить, что это формат nine-patch, а не обычный PNG-файл.
Рисунок 6. Кнопки разных размеров с файлом фона button.9.png в формате nine-patch.
Источник: www.fandroid.info
Правильно ли я понимаю dp/dip в Android?
Конкретное число пикселей в 1 dp зависит от PPI (pixels per inch, он же DPI) экрана.
Т.е. если PPI равен 320, то в 1dp будет 2 пикселя (320/160).
Отсюда можно сделать вывод, что указав размер элемента в 160dp, реальный размер элемента на любом экране будет равен 1 дюйму. Ведь 160dp это 160 штук по 1/160 части дюйма, а это и есть 1 дюйм. А сколько в этом дюйме окажется пикселей зависит от PPI.
Например, в 8dp устройства с PPI=320 окажется 16 пикселей, с PPI=480 будет 24. Но конечные физические размеры 8dp будут одинаковыми — это всегда будет 8/160 дюйма экрана не зависимо от PPI.
Еще раз тоже самое: взяв линейку и начав мерить размеры элементов заданные в dp, везде будут примерно одинаковые физические размеры элемента. При этом масштабирования происходить не будет: кнопка занимающая пол экрана на маленьком устройстве, на большом экране будет занимать меньше места, но физические размеры этих кнопок будут одинаковые.
Я правильно понял?
- Вопрос задан более трёх лет назад
- 906 просмотров
2 комментария
Оценить 2 комментария
Источник: qna.habr.com