Размытие окон

В Android 12 доступны общедоступные API-интерфейсы для реализации эффектов размытия окон (таких как размытие фона и размытие позади). Обратите внимание, что хотя вы можете видеть размытие окна, также называемое размытием между окнами в коде, документации разработчика или обозначениях пользовательского интерфейса, размытие между окнами - это то же самое, что размытие окна.

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

только размытие фона

1

размытие только позади

2

сзади и размытие фона

3

Рисунок 1. размытия фона только (1), размытие позади только (2), размытие фона и размытие позади (3)

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

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

Реализация

OEM-производители и партнеры

Размытие окон по умолчанию отключено. Чтобы включить функцию размытия на устройствах, сделайте следующее:

  • Убедитесь, что устройство может справиться с дополнительной нагрузкой на графический процессор - операция размытия стоит дорого, а на устройствах более низкого уровня она может привести к пропаданию кадров. Включайте это только на устройствах с достаточной мощностью графического процессора.
  • Убедитесь , что ваши librenderengine орудия размывание логика - по умолчанию Android 12 движок рендеринга делает, но пользовательские движок рендеринга должен реализовать сам размывания логику.
  • Включите размытие, установив следующую sysprop поверхности:
# enable surface flinger window blurs
PRODUCT_PROPERTY_OVERRIDES += \
       ro.surface_flinger.supports_background_blur=1

Сторонние разработчики

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

  1. Устройство работает под управлением Android 11 или более ранней версии. Поскольку размытие окон доступно только на устройствах с Android 12 и более поздних версий, приложения должны реализовывать резервную, плавную альтернативу для устройств под управлением Android 11 и более ранних версий.
  2. Устройство не поддерживает окна размытости , потому что они дорогие, поэтому младшие устройства могут отбрасывать кадры при визуализации их. В таких случаях приложения должны обеспечивать резервное плавное воспроизведение.
  3. Сервер системы (например, в режиме экономии энергии батареи, или из - за установленный разработчик или туннельного режим) отключает смазывание во время выполнения.

Пункты 2 и 3 выше, как сообщают слушатель , зарегистрированный WindowManager.addCrossWindowBlurEnabledListener . Если ваши приложения используют API размытия, зарегистрируйте этот прослушиватель и обновляйте свой пользовательский интерфейс при каждом вызове прослушивателя, если вы хотите использовать другой пользовательский интерфейс для состояний с включенным и отключенным размытием. Когда он зарегистрирован, слушатель немедленно вызывается, чтобы сообщить, включены ли в настоящее время размытия.

Реализуйте функции размытия, используя следующие методы:

Примеры и источник

public class BlurActivity extends Activity {
   private final int mBackgroundBlurRadius = 150;
   private final Drawable mBackgroundDrawableWithBlur;
   private final Drawable mBackgroundDrawableNoBlur;

   private final int mBlurBehindRadius = 50;
   private final float mDimAmountWithBlur = 0.1f;
   private final float mDimAmountNoBlur = 0.6f;


   private Consumer<Boolean> mCrossWindowBlurEnabledListener = enabled -> {
       getWindow().setBackgroundDrawable(
               enabled ? mBackgroundDrawableWithBlur : mBackgroundDrawableNoBlur);
       getWindow().setDimAmount(enabled ? mDimAmountWithBlur : mDimAmountNoBlur);
   };

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.blur_activity);

       mBackgroundDrawableWithBlur = getContext().getResources().getDrawable(
               R.drawable.window_background_with_blur);
       mBackgroundDrawableNoBlur = getContext().getResources().getDrawable(
               R.drawable.window_background_no_blur);

       if (Android version >= Android S) {
           getWindow().addFlags(
                   WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
           window.getAttributes().setBlurBehindRadius(mBlurBehindRadius);
           window.setBackgroundBlurRadius(mBackgroundBlurRadius);
           getWindow().getDecorView().addOnAttachStateChangeListener(
                                         new View.OnAttachStateChangeListener() {
                    @Override
                    public void onViewAttachedToWindow(View v) {
                        getWindowManager().addCrossWindowBlurEnabledListener(
                                                     blurEnabledListener);
                    }

                       @Override
                   public void onViewDetachedFromWindow(View v) {
                       getWindowManager().removeCrossWindowBlurEnabledListener(
                                                      blurEnabledListener);
                     }
           });
       }
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
   }

Включение и выключение размытия окна

Есть два способа разрешить или запретить размытие окон.

  1. Из пользовательского интерфейса:

    Настройки -> Система -> Параметры разработчика -> Аппаратное ускорение рендеринга -> Разрешить размытие на уровне окна

  2. Из терминала (устройство должно быть рутировано):

adb shell wm disable-blur 1 # 1 disables window blurs, 0 allows them

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

Когда вы включаете размытие для своих устройств, учтите, что другие вещи, такие как режим экономии заряда батареи или мультимедийное туннелирование, могут отключить их. Blurs включены , когда все необходимые условия поддерживаются встретились-они, и ничего не отключая их. Для того, чтобы увидеть , если текущее состояние функциональных размытости «включена,» использовать adb shell wm disable-blur команды.

Проверка

Для обеспечения вашей версии размытости особенности работы , как вы хотели, реализовать логику пользовательского интерфейса , так что он перерисовывает элементы пользовательского интерфейса , когда blurEnabled изменения (как сообщает addCrossWindowBlurEnabledListener ).

  1. Откройте интерфейс с размытием.
  2. Используйте шаги , указанные для Включения окна размытости и выключается из пользовательского интерфейса или с помощью CLI.
  3. Убедитесь, что пользовательский интерфейс меняется на размытый и наоборот.

Исправление проблем

Используйте следующее в качестве руководства для устранения неполадок во время проверки.

Нет размытия

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

    1. Используйте adb shell wm disable-blur команды, которая печатает поддерживается ли размывает на этом устройстве , и являются ли они в настоящее время включены.
    2. Перейдите в раздел Настройки -> Система -> Параметры разработчика -> Аппаратное ускорение рендеринга -> Разрешить размывает окно уровня. Если вы не можете найти там опцию, размытие не поддерживается на вашем устройстве.
  • Убедитесь, что вы установили полупрозрачный цвет фона окна; непрозрачный цвет фона окна скрывает (закрывает) размытую область.

Тестовое устройство не поддерживает размытие окон

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

Без закругленных углов

  • Определите скругленные углы, установив окно фона вытяжки - Window#setBackgroundDrawable . Это определяет контур области размытия.

При обновлении параметра разработчика не включаются размытия

  • Проверьте, находится ли устройство в режиме экономии заряда батареи, использует ли оно мультимедийное туннелирование (для ТВ) или что-то еще отключает функцию размытия.

Размытие фона отображается в полноэкранном режиме, вне границ окна

  • Убедитесь , что окно отмечено как плавающая - android:windowIsFloating
  • Убедитесь , что вы установили окно фон вытяжку - Window#setBackgroundDrawable . Это определяет контур области размытия.

Обновления от слушателя не применяются на экране

  • Убедитесь, что окно уничтожается и создается заново, пока экземпляр, с которым работает слушатель, не обновляется. Обновления слушателя могут применяться к старому экземпляру окна.