Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Desenfoques de ventana

En Android 12, las API públicas están disponibles para implementar efectos de desenfoque de ventana (como desenfoque de fondo y desenfoque detrás). Tenga en cuenta que, aunque es posible que vea el desenfoque de ventana también llamado desenfoque de ventana cruzada en el código, la documentación del desarrollador o la notación de la interfaz de usuario, el desenfoque de ventana cruzada es lo mismo que el desenfoque de ventana.

Con estas API, puede difuminar lo que esté detrás de su propia ventana. Puede crear ventanas con fondos borrosos, creando un efecto de vidrio esmerilado, o mostrar ventanas con toda la pantalla detrás de ellas borrosa, creando un efecto de profundidad de campo. También puede combinar los dos efectos.

solo desenfoque de fondo

1

difuminar solo detrás

2

detrás y desenfoque de fondo

3

Figura 1. Antecedentes desenfoque solamente (1), falta de definición sólo por detrás (2), el desenfoque de fondo y el desenfoque detrás (3)

La función de desenfoque de ventana funciona en todas las ventanas, lo que significa que también funciona cuando hay otra aplicación detrás de la ventana que está viendo. Esto no es lo mismo que un desenfoque hacer efecto , que difumina el contenido dentro de una ventana dentro de la misma aplicación. Los desenfoques de ventana son útiles para cuadros de diálogo, hojas inferiores y otras ventanas flotantes.

Es importante tener en cuenta que esta función utiliza importantes recursos de GPU. Entonces, aunque está disponible para todos los dispositivos Android, solo es compatible con aquellos dispositivos que tienen suficiente potencia de GPU.

Implementación

OEM y socios

Los desenfoques de ventana están desactivados de forma predeterminada. Para habilitar la función de desenfoque en los dispositivos, haga lo siguiente:

  • Asegúrese de que el dispositivo pueda manejar la carga adicional de la GPU: la operación de desenfoque es costosa y, en dispositivos de gama baja, puede provocar la pérdida de fotogramas. Habilite esto solo en dispositivos con suficiente potencia de GPU.
  • Asegúrese de que sus librenderengine implementa la lógica borrosa - el defecto de Android 12 motor de render hace, pero ninguna costumbre motor de render debe implementar la lógica borrosa en sí.
  • Habilite los desenfoques configurando el siguiente sysprop de flinger de superficie:
# enable surface flinger window blurs
PRODUCT_PROPERTY_OVERRIDES += \
       ro.surface_flinger.supports_background_blur=1

Desarrolladores de terceros

Consulte los ejemplos y Fuente sección para ver el código de ejemplo. El servidor del sistema puede desactivar los desenfoques de ventana en tiempo de ejecución. Por lo tanto, una aplicación debe proporcionar una versión alternativa sin borrosidad. De lo contrario, si los desenfoques no se procesan porque estaban deshabilitados, el fondo de la ventana puede ser tan transparente que el contenido dentro de la ventana se vuelve ilegible. Si su aplicación no proporciona una versión alternativa, asegúrese de que su interfaz de usuario funcione tanto con los desenfoques habilitados como con los desenfoques deshabilitados. Estas son las tres condiciones bajo las cuales se pueden desactivar los desenfoques en cualquier momento:

  1. El dispositivo ejecuta Android 11 o una versión anterior. Dado que los desenfoques de ventana están disponibles solo en dispositivos con Android 12 y versiones posteriores, las aplicaciones deben implementar una alternativa de experiencia sin desenfoque de respaldo para dispositivos con Android 11 y versiones anteriores.
  2. El dispositivo no admite borrones ventana porque son caros, por lo que los dispositivos de gama baja podrían disminuir los cuadros cuando la prestación de ellos. Para tales casos, las aplicaciones deben proporcionar una experiencia alternativa sin borrosidad.
  3. El servidor del sistema (por ejemplo, durante el modo de ahorro de batería, o debido a un entorno desarrollador o el modo de túnel) desactiva la falta de definición en tiempo de ejecución.

Puntos 2 y 3 anteriormente son ambos reportados por un detector registrado con WindowManager.addCrossWindowBlurEnabledListener . Si sus aplicaciones usan las API de desenfoque, registre este oyente y actualice su interfaz de usuario cada vez que se llame al oyente, si desea utilizar una interfaz de usuario diferente para los estados de desenfoque habilitado y deshabilitado. Cuando está registrado, se llama al oyente inmediatamente para informar si los desenfoques están habilitados actualmente.

Implemente las funcionalidades de desenfoque utilizando los siguientes métodos:

Ejemplos y fuente

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);
   }

Activar y desactivar el desenfoque de la ventana

Hay dos formas de permitir y no permitir el desenfoque de la ventana.

  1. Desde la interfaz de usuario:

    Configuración -> Sistema -> Opciones de desarrollador -> Representación acelerada por hardware -> Permitir desenfoques a nivel de ventana

  2. Desde la terminal (el dispositivo debe estar rooteado):

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

Solo puede activar o desactivar la función de desenfoque de ventana si su dispositivo tiene la capacidad de admitir desenfoques. (Los dispositivos que no admiten los desenfoques de ventana no pueden habilitar la función). De forma predeterminada, los desenfoques están habilitados en los dispositivos que los admiten.

Cuando habilita los desenfoques para sus dispositivos, tenga en cuenta que otras cosas como el modo de ahorro de batería o la tunelización multimedia pueden deshabilitarlos. Desenfoques se habilitan cuando todas las condiciones necesarias conocido-son compatibles, y nada se les incapacitantes. Para ver si el estado actual de la funcionalidad de la falta de definición es "activado", utilizar el adb shell wm disable-blur de comandos.

Validación

Para asegurar que su versión de la falta de definición cuenta con obras como se pretendía, implementan la lógica de la interfaz de usuario de modo que vuelve a dibujar los elementos de interfaz de usuario cada vez que blurEnabled cambios (según lo informado por addCrossWindowBlurEnabledListener ).

  1. Abra la interfaz de usuario que tiene desenfoque.
  2. Utilice los pasos dados para Turning desenfoque ventana dentro y fuera de la interfaz de usuario o mediante la CLI.
  3. Verifique que la interfaz de usuario cambie hacia y desde una sin desenfoque como se esperaba.

Solución de problemas

Utilice lo siguiente como guía para la resolución de problemas durante la validación.

Sin desenfoque dibujado

  • Verificar que los borrones están habilitados actualmente (y que admite su hardware ellos), ya sea por medio de la CLI o la navegación a Ajustes.

    1. Utilice el adb shell wm disable-blur de comandos, que imprime si las faltas de definición son compatibles con este dispositivo y de si están actualmente habilitados.
    2. Vaya a Configuración -> Sistema -> Opciones de desarrollador -> renderizado acelerado por hardware -> Permitir faltas de definición de nivel de ventana. Si no puede encontrar la opción allí, los desenfoques no son compatibles con su dispositivo.
  • Asegúrese de establecer un color de fondo de ventana translúcido; un color de fondo de ventana opaco oculta (cubre) el área borrosa.

El dispositivo de prueba no admite desenfoques de ventana

  • Pruebe su aplicación en el emulador de Android 12. Para configurar un emulador de Android, consulte el configurar un emulador de Android direcciones. Cualquier dispositivo virtual de Android que cree con el emulador admitirá los desenfoques de ventana.

Sin esquinas redondeadas

  • Definir las esquinas redondeadas mediante el establecimiento de un fondo de la ventana dibujable - Window#setBackgroundDrawable . Esto determina el contorno del área de desenfoque.

Actualizar la opción de desarrollador no habilita los desenfoques

  • Verifique si el dispositivo está en modo de ahorro de batería, si está usando tunelización multimedia (para TV) o si algo más está deshabilitando la función de desenfoque.

Desenfoque de fondo dibujado a pantalla completa, no dentro de los límites de la ventana

  • Asegúrese de que la ventana se marca como flotando - android:windowIsFloating
  • Asegúrese de que ha establecido un fondo de la ventana dibujable - Window#setBackgroundDrawable . Esto determina el contorno del área de desenfoque.

Las actualizaciones del oyente no se aplican en la pantalla

  • Compruebe si la ventana se destruye y se vuelve a crear mientras la instancia en la que está operando el oyente no se actualiza. Es posible que las actualizaciones del oyente se estén aplicando a una instancia de ventana antigua.