- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Данный пункт важен, в основном, при разработке игр, а не обычных приложений…
Android. Побеждаем фрагментацию
При таком разнообразии разрешений возникает несколько проблем. Вот часть из них:

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

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

Проблема 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. Побеждаем фрагментацию
Вот статистика версий операционной системы, на которых стояла моя предыдущая игра.
Как видите, у большинства юзеров, играющих в игры, вполне новые версии Android. Так что этот пункт особых проблем не вызывает.

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

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

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

Автор: SergioShpadi

Источник [1]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/interfejsy/24288

Ссылки в тексте:

[1] Источник: http://habrahabr.ru/post/165077/