Урок 3. Ориентация экрана устройства
Как известно, телефон или планшет пользователь может время от времени переворачивать. Так-же в настройках Android есть функция автоматического перевертывания экрана в альбомный/портретный вид в зависимости от положения устройства. Тогда часто возникает ситуация, что приложение рассчитанное на работу в портретном режиме, выглядит не функционально в альбомном режиме. Есть несколько вариантов решения данного вопроса. Первый — для альбомного и портретного режима рисовать две разные формы представления приложения. Второй — отслеживать положение устройства самостоятельно, и перерисовывать положение элементов в зависимости от ориентации. Пока рассмотрим первый вариант как самый простой.В качестве примера возьмем приложение из предыдущего урока:
, нажмите «Create Landscape Variation». В левой части проекта в папке res-activity_form1 появится дополнительный файл activity_form1.xml(land). Открыв его, увидим копию портретной формы, только в альбомом варианте расположения. Перетащим элементы так, чтобы было удобно их использовать и при данном расположении:
Запускаем приложение. В эмуляторе нажимаем Ctrl-F11 (поворот экрана), и наслаждаемся:
Узнать ориентацию программно
Чтобы из кода узнать текущую ориентацию, можно создать следующую функцию:
1 2 3 4 5 6 7 8 9 10 |
<code class="java"> private String getScreenOrientation(){ if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) return "Портретная ориентация"; else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) return "Альбомная ориентация"; else return ""; } </code> |
Вызовите данную функцию из нужного места, например, при щелчке кнопки и узнайте текущую ориентацию. В примере использовались две распространённые системные константы для ориентации. Есть еще константа ORIENTATION_SQUARE (квадратный экран).
В какую сторону повернуто устройство?
Хорошо, мы можем определить текущую ориентацию, но в какую сторону повернули устройство? Ведь его можно повернуть влево, вправо или вообще вверх тормашками. Напишем другую функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<code class="java"> private String getRotateOrientation() { int rotate = getWindowManager().getDefaultDisplay().getRotation(); switch (rotate) { case Surface.ROTATION_0: return "Не поворачивали"; case Surface.ROTATION_90: return "Повернули на 90 градусов по часовой стрелке"; case Surface.ROTATION_180: return "Повернули на 180 градусов"; case Surface.ROTATION_270: return "Повернули на 90 градусов по часовой стрелке"; default: return "Не понятно"; } } </code> |
Установить ориентацию программно и через манифест
Если вы хотите запустить приложение в стиле «вид сбоку», то можете сделать это программно. Разместите код в методе onCreate():
1 2 3 4 5 |
<code class="java"> import android.content.pm.ActivityInfo; setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); </code> |
Вы можете запретить приложению менять ориентацию, если добавите нужный код в onCreate().
1 2 3 4 5 |
<code class="java"> setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //для альбомного режима // или setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //для портретного режима </code> |
Но указанный способ не совсем желателен. Лучше установить нужную ориентацию через манифест, прописав в элементе <activity> параметр android:screenOrientation:
1 2 3 4 |
<code class="xml"> android:screenOrientation="portrait" android:screenOrientation="landscape" </code> |
Кстати, существует ещё один вариант, когда устройство полагается на показания сенсора и некоторые другие:
1 2 3 |
<code class="xml"> android:screenOrientation="sensor" </code> |
В статье использовались материалы с сайта http://developer.alexanderklimov.ru/