Статьи

60 Android Hacks: работа в режиме Lights-Out

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

Первоначально Автор Карлос Сесса

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

60 Android-хаков

Карлос Сесса
Большинство игр или просмотрщиков изображений отображают весь экран. В этой статье, основанной на методике, представленной в 60 Android Hacks , автор показывает, как создать простое приложение, которое переходит в режим отключения при нажатии на фон. Лучше всего то, что он совместим между Android 2.x и 3.x.

Android 2.x

Сначала мы позаботимся о коде Android 2.x. В Android 2.x у нас есть концепция полноэкранного режима. Идея, стоящая за полноэкранным режимом, заключается в том, чтобы окно приложения могло использовать все пространство дисплея.

Нас также интересует другая концепция: название приложения. Название приложения — это серая полоса, которую мы видим в верхней части экрана. Вот код для создания эффекта:

Перечисление 1, Удаляющее название приложения в Android 2.x

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);                     #1

    setContentView(R.layout.main);
    mContentView = findViewById(R.id.content);
    mContentView.setOnClickListener(new OnClickListener() {            #2
        @Override
        public void onClick(View v) {

            Window w = getWindow();
            if(mUseFullscreen) {                                       #3
             w.addFlags(
             WindowManager.LayoutParams.FLAG_FULLSCREEN);

             w.clearFlags(
             WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

            } else {
             w.addFlags(
             WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

             w.clearFlags(
             WindowManager.LayoutParams.FLAG_FULLSCREEN);
            }

            mUseFullscreen = !mUseFullscreen;
       }
    });
}

Код не требует пояснений. В # 1 мы просим удалить строку заголовка. Это необходимо сделать до вызова setContentView (), и, к сожалению, это невозможно сделать динамически. В # 2 мы делаем общий вызов setContentView () и просим ссылку на корневой элемент нашего представления. Этот элемент будет работать как выключатель для полноэкранного режима.

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

Android 3.x

В Android 3.x концепции, объясненные для Android 2.x, немного различаются. Строка заголовка в конечном итоге представляет собой панель действий в верхней части экрана, а строка состояния — в нижней части экрана.

Важным изменением в Android 3.x является отсутствие физических кнопок; они все размещены в строке состояния. Из-за этого строка состояния не может быть отклонена, но она может быть затемнена. Вот код:

Перечисление 2, Затемняющее строку состояния в Android 3.x

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mContentView = findViewById(R.id.content);                         #1

    mContentView.setOnSystemUiVisibilityChangeListener(                #2
            new OnSystemUiVisibilityChangeListener() {

                public void onSystemUiVisibilityChange(int visibility) {

                    ActionBar actionBar = getActionBar();

                    if (actionBar != null) {
                        mContentView.setSystemUiVisibility(visibility);

                        if (visibility == View.STATUS_BAR_VISIBLE) {   #3
                            actionBar.show();
                        } else {
                            actionBar.hide();
                        }
                    }
                }
            });

    mContentView.setOnClickListener(new OnClickListener() {            #4
        public void onClick(View v) {

            if (mContentView.getSystemUiVisibility() ==
                View.STATUS_BAR_VISIBLE) {

                mContentView.setSystemUiVisibility(
                    View.STATUS_BAR_HIDDEN);

            } else {
                mContentView.setSystemUiVisibility(
                    View.STATUS_BAR_VISIBLE);
            }
        }
    });
}

Аналогично тому, что мы делали раньше, мы получаем ссылку на корневой элемент нашего представления в # 1. В Honeycomb представления имеют новый метод setOnSystemUiVisibilityChangeListener (). Это было создано, чтобы иметь место для получения обратных вызовов при изменении видимости системной панели. В # 2 я использовал этот метод, чтобы скрыть или показать панель действий в зависимости от параметра видимости, как вы можете видеть в # 3. В # 4 мы установили прослушиватель щелчков в корневом представлении, где мы переключаем видимость системного интерфейса, что в основном означает включение и выключение режима отключения.

Объединение обоих миров в одном действии

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

Перечисление 3, Проверяющее версию Android

if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {        #1
    configure3x();
} else {
  configure2x();
}

Для создания оператора if я использовал класс Build. Как видно из # 1, класс Build также имеет внутренний класс VERSION_CODES, который можно использовать для проверки версии, на которой работает устройство.

Резюме

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

   

Вот некоторые другие названия Мэннинга, которые могут вас заинтересовать:



Android в действии, третье издание
У. Фрэнк Эблсон, Роби Сен, Крис Кинг и К. Энрике Ортис
Android на практике Чарли Коллинз, Майкл Д. Галпин и Матиас Кепплер Основы Objective-C Кристофер К. Фэрбэрн, Йоханнес Фаренкруг и Коллин Ruffenach