О совместимости Android-приложений на различных устройствах

    Не секрет, что число устройств на Android велико, они различаются по железу, размерам и качеству экрана, мощности процессора и др.. В отличии от iPhone- программистов, которые знают наверняка на каком устройстве будет запущено их приложение, Android-разработчикам необходимо уделять внимание совместимости приложений с различными устройствами.

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

    image

    Для начала необходимо разобраться с возможностями, которые предоставляет Android для работы с экраном.

    Основные сведения

    Размер экрана(screen size) — физический размер экрана; предопределенные значения: small, normal, large, extra large*.

    Геометрический коэффициент(aspect ratio)– отношение физических пропорций экрана (ширины к высоте); предопределенные значения: long (для экранов, чьи размеры превосходят по ширине или высоте стандартные размеры экрана), notlong(для экранов, чьи размеры соответствуют стандартным).

    Плотность(density) – распределение пикселей относительно физических размеров экрана. Значение плотности распределения пикселей важно, поскольку один и тот же UI элемент, выраженный в пикселях для экранов с более низкой плотностью будет казаться больше, чем для экранов с высокой. Предопределенные значения для плотности: ldpi (low), mdpi (medium), hdpi (high), and xhdpi*.

    Независимый(от плотности) пиксел(density-independent или dp) – “виртуальный” пиксел, который может быть использован приложением для прорисовки UI-элементов. Данный пиксел является эквивалентом физического пиксела на экране с плотностью 160 dpi. Во время выполнения OS Android прорисовывает элемент в соответствии с формулой pixel = dp * (density/160), где density – плотность экрана.

    Стоит также отметить, что OS Android работает с разрешением экрана, через значения плотности экрана (никаких средств для работы с разрешением напрямую разработчик не имеет).

    На рисунке ниже показано как соотносятся значения плотности и размера экрана устройств с предопределенными значениями этих величин.

    image

    *Еще один момент, который стоит отметить: значение плотности xdpi было добавлено в версии Android 2.2(API level 8), значение экрана xlarge – в версии Android 2.3(API level 9)

    Работа с манифестом и загрузкой ресурсов

    Начиная с версии Android 1.6, в манифест был добавлен тег <support-screens>, который используется для определения класса устройств, на которых может быть запущено приложение. Атрибуты тега smallScreens, normalScreens, largeScreens, xlargeScreens соответствуют определенным выше значениям экрана и могут принимать значения true или false. Дефолтные значения атрибутов варьируются в зависимости от используемой версии Android (более детальную информацию можно посмотреть тут. ). При определении значения атрибута как true, OS Android получает сигнал о том, что приложение совместимо с соответствующим типом экрана и не применяет дополнительные средства для совместимости ( что происходит при значении false). Стоит также отметить, что эти средства(функции) работают только на совместимость с большими размерами экранов (т.о. если значение normalScreen – true, остальные – false, приложение будет также совместимо с экранами large и с xlarge, но не совместимо со small). Данный тег также используется Android Market'ом для фильтрации приложений.

    Для плотности также имеется атрибут – anyDensity, который также принимает значения true/false. Если значение атрибута – true, OS Android не использует функции для совместимости с различными плотностями экрана. В этом случае приложение должно использовать dp для прорисовки UI элементов, либо самостоятельно управлять вычислением размеров для различных плотностей. Если значение – false, OS Android включает функции для масштабирования элементов в соответствии с плотностью экрана.

    Размещение ресурсов

    OS Android также предоставляет средства для определения ресурсов, которые будут использованы для конкретных размеров экранов и плотностей. Ресурсы размещаются в соответствующих папках.

    res/layout/my_layout.xml // layout for normal screen size
    res/layout-small/my_layout.xml // layout for small screen size
    res/layout-large/my_layout.xml // layout for large screen size
    res/layout-large-land/my_layout.xml // layout for large screen size in landscape mode
    res/layout-xlarge/my_layout.xml // layout for extra large screen size

    res/drawable-ldpi/my_icon.png // image for low density
    res/drawable-mdpi/my_icon.png // image for medium density
    res/drawable-hdpi/my_icon.png // image for high density

    res/drawable-nodpi/composite.xml // density independent resource

    Поддержка совместимости экранов

    Коротко механизм поддержки можно описать с помощью следующих шагов:
    1. OS Android получает значения атрибутов тега support-screens из манифеста.
    2. Подгружаются ресурсы для соответствующего размера экрана и плотности (это происходит независимо от данных, полученных в п.1).
    3. В соответствии с п.1 OS Android включает/не включает функции для обеспечения совместимости.
    4. Производится прорисовка элементов.

    Общие рекомендации для создания совместимого приложения

    • Использовать значения wrap_content, fill_parent, dp в макетах.
    • Избегать использования AbsoluteLayout .
    • Использовать методы класса ViewConfiguration для получения стандартных значений размеров, скорости, времени.
    • Использовать разные ресурсы для разных значений плотности и размеров экрана.

    Послесловие

    Статья не охватывает практических моментов, связанных с тестированием приложения на девайсах с различными характеристиками экранов, думаю выделить это в отдельный пост.

    Основной источник: developer.android.com
    Поделиться публикацией

    Комментарии 19

      +7
      Спасибо за статью, очень полезная информация.
      Жаль, что сейчас не все разработчики приложений думают о совместимости.
        +4
        Я как раз сегодня ночью делал слайды для презентации на смежную тему

        В примерах на developer.android.com есть ошибки, они и к вам перекочевали
        res/drawable-lhdpi/my_icon.png // image for low density
        res/drawable-mdpi/dpi/my_icon.png // image for medium density

        Вообще, тема достаточно широкая и интересная
          0
          Спасибо, видел ошибки, казалось исправлял, а оказалось нет. Теперь точно исправил.
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            Ну у Java были разные реализации машины, тут такого скорее всего не будет. =)
            +3
            Все-таки это не столько рекомендации, сколько описание принципов, которыми следует руководствоваться при разработке приложений для Android. Я планировал написать миницикл статей на эту тему, но праздничные дни внесли некоторые корректировки, потому на данный момент написано только 2 из 5 запланированных.
              +2
              Тема действительно обширная, в статье показаны базовые сведения, уверен Ваш цикл не останется без внимания. Я думаю продолжить тему но с более практической стороны.
              +1
              есть еще low-end телефоны на андроиде, под них затачивают переключая механизм работы(меньше ресурсов, чтобы колом не встало). Как пример — angrybirds
                –1
                на лоу-эндах типа Hero или Wildfire птички и так не идут… )
                  +2
                  Вранье, я прошел на герое.
                  • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    на LG GT540 терпимо идут…
                  –1
                  Было бы здорово, если бы объединили все статьи про Андройд в одну большую, где указывались бы ссылки на различные материалы на Хабре, ранжированные по темам.
                    +2
                    Вот бы что нибудь действительно полезного увидеть а не просто перевод с developer.android.com
                      +1
                      Это не просто перевод, а выборочный и агрегированный, цель которого — привлечение внимания к вопросу. Насчет продолжения темы, повторять не буду, постараюсь сделать более интересной.
                        0
                        Быть может, эта статья вам покажется хотя бы немного полезной.
                          0
                          Спасибо больше, ссылку кстати можно в топик добавить на мой взгляд написано более доступно. К сожалению и здесь я не смог найти ничего кроме более перефразированного перевода официальной документации.
                        –1
                        Проблемы возникают, как правило, не из-за разных разрешений экранов, а из-за разных соотношений сторон.
                          0
                          Вот еще полезное описание, которое даю постоянно своим дизайнерам dexxtr.com/post/50327457086/multiple-screens-and-scaling-android-ui-images

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое