Android. Побеждаем фрагментацию

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



1. Планшеты и телефоны. Планирование интерфейса


Одним из главных отличием девайсов на базе Android является физический размер. «Зоопарк устройств» содержит как и крохотные телефоны, так и огромные десятидюймовые планшеты. И про этот чрезвычайно важный момент многие начинающие разработчики часто забывают.

Коренное различие телефонов и планшетов состоит в том, как пользователь держит их:

Телефоны в портретной ориентации

Обычно держатся в одной руке. Нажатия осуществляются большим пальцем этой же руки. Палец достает везде, но интуитивно удобна нижняя половина экрана.


Телефоны в альбомной ориентации

Обычно держатся двумя руками. Нажатия осуществляются большими пальцами обеих рук. Удобно доставать элементы управления в любой части экрана.


Планшеты в любой ориентации

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


Маленькие планшеты

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


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


2. Разрешение экрана. Растяжение текстур


Данный пункт важен, в основном, при разработке игр, а не обычных приложений…

При таком разнообразии разрешений возникает несколько проблем. Вот часть из них:

Проблема 1. Чёткость изображений

Чтобы графика Вашей игры была достаточно хороша на любом девайсе, у Вас есть два пути. Либо Вы рисуете векторную графику, либо рисуете, а потом растягиваете растровую. Если Вы выбрали второй путь, то изначально рисуйте её для большого разрешения (например 1024х768), потому что при сжатии картинки чёткость изображения страдает меньше, чем при её растяжении.

Проблема 2. Правильность расположения

Не используйте в коде никаких «магических чисел». Расчет местоположения объекта должен вестись уже после растяжения графики. Координаты объектов должны зависеть от координат и размеров других объектов. Это особенно важно, если Вы хотите, чтобы круглое осталось круглым, а квадратное квадратным.
Вот пример определения координат кнопки из моей следующей игры.
againButton.setPosition(table.getX()+table.getWidth()/2-againButton.getWidth()/2,table.getY()+table.getHeight()-5*againButton.getHeight()/4);


Проблема 3. Физика Box2D

В моей предыдущей игре я использовал физический движок Box2D, и при тестировании был обнаружен баг, связанный с разрешением экрана. В Бокс2Д при эмуляции физики используется константа PixelToMeterRatio. От нее зависит, как ведут себя объекты: как коробка размером с коробку, или же как коробка размером с небоскреб. Изначально определите эту константу в зависимости от разрешения экрана.
image

Проблема 4. Соразмерность

При сжатии или растяжении текстур часто бывает так, что меняются отношения сторон. Например с 16:9 до 4:3. Из-за этого некоторые объекты могут стать некрасивыми. Чтобы этого не случилось делайте графику минималистской, мультяшно-рисованной. Это поможет выглядеть сжатой картинке не так ужасно…

3. Производительность


Если Вы собрались делать 3D-супермегашутер, то знайте, что такое потянут не все устройства, но большинство новых телефонов и планшетов справятся без труда. Ещё возьмите в расчет тот факт, что не все устройства поддерживают OPEN GL 2. Примерно 10% девайсов поддерживают лишь OPEN GL 1.1.
Основная проблема с производительностью кроется в другом: на разных девайсах приложение имеет разный ФПС. И если для обычных аппликаций это не так критично, то для игр это очень важная проблема. В игре, что я сейчас разрабатываю, я столкнулся с проблемой: на разных девайсах скорость передвижения главных героев червячков разная. После долгих разборок и тестов выяснилось, что это происходит из-за того, что я двигаю червячков на определенное кол-во пикселей в кадр, а при разном FPS это дает разную скорость… Пофиксился этот баг привязыванием «шага» к текущему FPS:
	shipConfig.setShipSpeed(activity.mCamera.getHeight()/(shipConfig.timePerCameraHeight*fpsCounter.getFPS()));

Повторюсь, при разработке под Android делайте код предельно мягким. Любое «число из ниоткуда» отражается в самых неожиданных местах.

4. Версия Android



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

5. Заключение


Фрагментация устройств хоть и является головной болью разработчика под Андроид, но если разобраться, то проблемы легко решаются. При бета-тесте будьте готовы, что несмотря на заявляемую Гуглом полную совместимость, на некоторых устройствах приложение вообще откажется работать, не отчаивайтесь.

Надеюсь, хотя бы один из изложенных мною советов поможет Вам не совершить ошибок, на которые натолкнулся я.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 37

    +3
    Теперь бы принудительно пропустить всех андроид-девелоперов через вашу статью, а то нормального софта под планшеты все еще очень и очень мало :(
      0
      Мы стараемся :)
      +17
      image


      Вот ты какая, жопа у Андроида.
        +6
        Один я подумал, что это вид сверху лицевой стороны, а не обратной?
          +6
          Вы пессимист. Я вижу буфера.
            +2
            Вы оптимист. Андроид все-таки мальчик
              –5
              А кто вам сказал? Может гермафродит?)
                0
                Вы пессимист — андроид может быть любого пола, ибо это сочетание органики, механики и электроники. В фильмах чаще всего — женского ;-)
            –3
            >потому что при сжатии картинки чёткость изображения страдает меньше, чем при её сжатии.

            Исправьте, пожалуйста.
              +15
              я двигаю червячков на определенное кол-во пикселей в кадр, а при разном FPS это дает разную скорость…

              Может быть вам стоило бы почитать теорию игрового цикла, перед тем как игры писать? Это основа основ гейм-дева.
                +1
                Помню, когда был маленький, мучился с такой проблемой на TPascal.
                  –3
                  Я двигал их как раз каждую итерацию геймлупа. Просто не учел изначально эту проблему.
                    +2
                    зря вы в геймлупе не передаете время текущего шага… зря-зря-зря… (неодобрительно киваю головой)
                  +6
                  Фрагментация не в разных Aspect Ratio, Resolution & Pixel Density. На Win всегда было куча разных экранов и никто не жаловался.

                  Фрагментация в том, что вы не можете быть уверены как ваша программа будет работать не попробовав ее на конкретном девайсе.

                  Примеры:
                  На Kindle Fire HD 7 & Kindle Fire HD 8.9 ось Y акселерометра флипнута. В результате многие игры (в том числе топовые) запусклись перевернутыми при выходе этих девайсов.
                  Snapdragon s4 в режиме OpenGL ES 1.1 дико тормозит. Наверняка кривые драйвера.
                  На некоторых девайсах (точной выборки нет) при выходе из моей игрушки музыка продолжала играть. Пофиксил танцами с бубном.

                  И еще туча проблем, с которыми вы НЕ столкнетесь, так как у вас на тест есть всего пара девайсов (у меня около 10), но которые обязательно вылезут у ваших юзеров.

                    0
                    В G+ ребята из гугла рассказывали, почему такое происходит и как делать правильно. Было около года назад, сейчас уже не найду, сам музыкой не занимался, в детали не вдавался, извините.
                      0
                      Это связано с activity life-cycle. Но дело не в этом. А в том, что баг репродюсится только на определенных девайсах. А ошибки допускают все. Вместе две этих фактора сильно ухудшают качестов ПО под андроид.
                        0
                        Оок, не спорю. Опыта музыки у меня нету, просто вспомнил что что-то такое мелькало (:
                    0
                    Статистика по разрешениям и версиям по вашей игре?
                    Можно привести статистику по странам?
                      0
                      Статистика по разрешениям взята из интернета. Статистика по версиям из моей прошлой малопопулярной игры. 95% пользователей были из России и Украины.
                      +8
                      Пфсс. Я ожидал здесь увидеть как минимум, новую технологию проверки, а тут базовые советы для новичков. «Побеждаем фрагментарность», хаха. Лучше бы рассказали про стили, про 9-patch, про сервисы тестирования, про плотность пикселей… Да про тысячу вещей надо рассказать в связи с фрагментарностью! Поставил минус.
                        0
                        А есть где-нибудь один хороший источник, где все эти правильные методы борьбы с фрагментацией вместе описываются?
                          0
                          В первую очередь можно посоветовать эту серию статей.., если у вас нет проблем с английским, конечно. Правда, может уже где-нибудь есть нормальный перевод.
                            +1
                            Можно написать об этом статью в принципе.
                        • UFO just landed and posted this here
                            +1
                            У меня картинка несколько иная:

                            Android 2.3.3 — 2.3.7 — 41,48 %
                            Android 4.0.3 — 4.0.4 — 37,98 %
                            Android 4.1 — 2 794
                            Android 2.2 — 1 397
                              0
                              У меня примерно так же, приложение совсем не игровое.
                              0
                              Наверное, это можно объяснить тем, что «хочу (купить) андроид поновее» коррелирует с «хочу играть в игрушки»?
                              +1
                              Первый же совет вызывает большие сомнения. Для игр — возможно, это сработает. Но часто бывает лучше убрать важные элементы именно наверх. Например, кнопки сохранить/отменить. Внизу они были бы недоступны и потребовалось бы лишнее нажатие, чтобы убрать клавиатуру:

                              image
                                +1
                                Проблема 4. Соразмерность
                                Просто отвратительный совет — сжимать картинку в зависимости от аспекта.
                                Правильнее было бы менять размеры игрового поля.
                                  +1
                                  По поводу версий у гугла другая картинка: developer.android.com/about/dashboards/index.html
                                    0
                                    То была статистика моей игры.
                                    +3
                                    image
                                    Почему при сжатии и последующем разжатии картинка приобрела больше деталей?
                                      0
                                      И не потеряла чёткость!
                                      0
                                      А мне на телефоне самая нижняя часть очень не удобна. Приходится корячить большой палец.
                                        +4
                                        Чтобы не было проблем с фрагментацией в игроделе, надо было для начала под винду игрушек написать. А чтобы в софте не было — в вебе поработать год-другой. Фрагментация в андроиде, лол. Вы фрагментацию ещё пока не видели, раз так считаете.
                                          0
                                          Плюсомета не имею, так что просто напишу комментарий.
                                            0
                                            Окай (:

                                        Only users with full accounts can post comments. Log in, please.