O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Janela embaçada

No Android 12, APIs públicas estão disponíveis para implementar efeitos de desfoque de janela (como desfoque de fundo e desfoque atrás). Observe que, embora você possa ver o desfoque de janela também chamado desfoque de janela cruzada no código, documentação do desenvolvedor ou notação de IU, desfoque de janela cruzada é a mesma coisa que desfoque de janela.

Com essas APIs, você pode desfocar o que quer que esteja por trás de sua janela. Você pode criar janelas com fundos desfocados, criando um efeito de vidro fosco, ou mostrar janelas com a tela inteira atrás deles desfocada, criando um efeito de profundidade de campo. Você também pode combinar os dois efeitos.

desfoque de fundo apenas

1

borrar atrás apenas

2

desfoque por trás e fundo

3

Figura borrão 1. Antecedentes única (1), atrás apenas borrão (2), borrão e borrão trás (3)

O recurso de desfoque de janela funciona em todas as janelas, o que significa que também funciona quando há outro aplicativo atrás da janela que você está visualizando. Este não é o mesmo que um borrão tornar efeito , que desfoca o conteúdo dentro de uma janela dentro do mesmo aplicativo. Os desfoques de janela são úteis para diálogos e folhas inferiores e outras janelas flutuantes.

É importante observar que esse recurso usa recursos de GPU significativos. Portanto, embora esteja disponível para todos os dispositivos Android, ele só é compatível com os dispositivos que têm potência de GPU suficiente.

Implementação

OEMs e parceiros

As manchas de janela estão desabilitadas por padrão. Para ativar a funcionalidade de desfoque em dispositivos, faça o seguinte:

  • Certifique-se de que o dispositivo pode lidar com a carga extra da GPU - a operação de desfoque é cara e em dispositivos inferiores, pode causar perda de quadros. Habilite isso apenas em dispositivos com potência de GPU suficiente.
  • Garantir que seus librenderengine implementa a lógica esbater - o padrão Android 12 mecanismo de renderização faz, mas qualquer costume mecanismo de renderização deve implementar a própria lógica borrar.
  • Habilite os borrões configurando o seguinte sysprop do defletor de superfície:
# enable surface flinger window blurs
PRODUCT_PROPERTY_OVERRIDES += \
       ro.surface_flinger.supports_background_blur=1

Desenvolvedores terceirizados

Consulte os exemplos e Fonte seção para ver exemplo de código. As manchas de janela podem ser desabilitadas em tempo de execução pelo servidor do sistema. Portanto, um aplicativo deve fornecer uma versão alternativa sem manchas. Caso contrário, se os borrões não forem renderizados porque foram desativados, o fundo da janela pode ser tão transparente que o conteúdo dentro da janela se torna ilegível. Se o seu aplicativo não fornece uma versão de app reserva, certifique-se de que sua IU funciona tanto com desfoque habilitado quanto com desfoque desativado. Estas são as três condições sob as quais os desfoque podem ser desativados a qualquer momento:

  1. O dispositivo está executando o Android 11 ou inferior. Uma vez que as manchas de janela estão disponíveis apenas em dispositivos Android 12 e superior, os aplicativos devem implementar uma alternativa de experiência sem desfoque para dispositivos que executam o Android 11 e inferior.
  2. O dispositivo não suportar borrões janela porque eles são caros, por isso os dispositivos low-end pode ignoram quadros quando tornando-os. Para tais casos, os aplicativos devem fornecer uma experiência sem manchas de fallback.
  3. O servidor do sistema (por exemplo, durante o modo de economia de bateria, ou devido a uma definição desenvolvedor ou modo de túnel) desabilita borrão em tempo de execução.

Pontos 2 e 3 acima são ambos relatados por um ouvinte registrado com WindowManager.addCrossWindowBlurEnabledListener . Se seus aplicativos usam APIs de desfoque, registre este ouvinte e atualize sua IU sempre que o ouvinte for chamado, se você quiser usar uma IU diferente para os estados habilitado para desfoque e desabilitado para desfoque. Quando está registrado, o ouvinte é chamado imediatamente para relatar se os borrões estão ativados no momento.

Implemente as funcionalidades de desfoque usando os seguintes métodos:

Exemplos e fonte

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

Ativando e desativando o desfoque da janela

Existem duas maneiras de permitir e proibir desfoques nas janelas.

  1. Da IU:

    Configurações -> Sistema -> Opções do desenvolvedor -> Renderização acelerada por hardware -> Permitir desfoques no nível da janela

  2. A partir do terminal (o dispositivo deve ser enraizado):

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

Você só pode ativar ou desativar a funcionalidade de desfoque de janela se o seu dispositivo tiver a capacidade de suportar desfoque. (Dispositivos que não oferecem suporte a desfoques de janela não podem habilitar o recurso.) Por padrão, os desfoques são habilitados em dispositivos que os suportam.

Quando você ativa os desfoques em seus dispositivos, considere que outras coisas, como o modo de economia de bateria ou o tunelamento de multimídia, podem desativá-los. Borrões são ativados quando todas as condições necessárias são atendidas-eles são suportados, e nada é desativá-los. Para ver se o estado atual da funcionalidade borrão é "ativado", utilizar o adb shell wm disable-blur de comando.

Validação

Para garantir a sua versão do borrão apresenta obras como pretendido, implementar a lógica de interface do usuário para que ele redesenha os elementos de interface do usuário sempre que blurEnabled mudanças (como relatado por addCrossWindowBlurEnabledListener ).

  1. Abra a IU que tem desfoque.
  2. Use os passos indicados para Virando borrão janela e desligar a partir da interface ou pela CLI.
  3. Verifique se a IU muda de e para um sem desfoque, conforme o esperado.

Solução de problemas

Use o seguinte como um guia para solução de problemas durante a validação.

Nenhum borrão desenhado

  • Verifique se as manchas são atualmente habilitado (e que seus suportes de hardware deles) ou usando o CLI ou navegando para Configurações.

    1. Use o adb shell wm disable-blur comando, que imprime se borrões são suportados no dispositivo e se eles estão atualmente habilitado.
    2. Navegue até Configurações -> Sistema -> Opções do desenvolvedor -> Hardware acelerado tornando -> Permitir borrões de nível janela. Se você não conseguir encontrar a opção lá, os desfoques não são compatíveis com seu dispositivo.
  • Certifique-se de definir uma cor de fundo de janela translúcida; uma cor de fundo de janela opaca oculta (cobre) a área desfocada.

O dispositivo de teste não oferece suporte a desfoque de janela

  • Teste seu aplicativo no emulador do Android 12. Para configurar um emulador do Android, consulte o Set-se um emulador do Android direções. Qualquer dispositivo virtual Android que você criar com o emulador terá suporte para desfoque de janela.

Sem cantos arredondados

  • Definir os cantos arredondados, definindo um drawable fundo da janela - Window#setBackgroundDrawable . Isso determina o contorno da área de desfoque.

Atualizar a opção do desenvolvedor não ativa desfoques

  • Verifique se o dispositivo está no modo de economia de bateria, se está usando túnel multimídia (para TV) ou se algo mais está desativando a funcionalidade de desfoque.

Desfoque de fundo desenhado em tela cheia, fora dos limites da janela

  • Certifique-se de que a janela está marcada como flutuante - android:windowIsFloating
  • Certifique-se que você tiver definido um drawable fundo da janela - Window#setBackgroundDrawable . Isso determina o contorno da área de desfoque.

As atualizações do ouvinte não são aplicadas na tela

  • Verifique se a janela está sendo destruída e recriada enquanto a instância que está sendo operada pelo listener não é atualizada. As atualizações do listener podem estar sendo aplicadas a uma instância de janela antiga.