Widget Backdrop Filter em Flutter

Tempo de leitura: 6 minutes

Às vezes, você precisa aplicar um impacto desfocado em seu aplicativo. Como você pode causar tanto impacto se estiver usando o Flutter? Um widget chamado BackdropFilter é apropriado por esse motivo. BackdropFilter é um widget que aplica um filtro à substância pintada atual e depois pinta seu widget filho. O Flutter aplicará o filtro a todos os espaços dentro do clipe do widget pai. Isso significa que, se não houver clipe, o filtro será aplicado a toda a tela.

Neste artigo, exploraremos o Widget de filtro de pano de fundo no Flutter. Veremos como implementar um programa de demonstração do widget de filtro de pano de fundo e mostraremos como usar esse widget para criar um efeito de desfoque em seus aplicativos flutter.

 

Widget Backdrop Filter:

O widget Flutter Backdrop Filter está sendo usado para criar efeitos de desfoque em imagens, contêineres e todos os widgets. O widget Filtro de pano de fundo é utilizado com uma mistura da classe ImageFilter. Ele aplica um filtro no widget atual e causa o impacto do desfoque abaixo do widget atual. Tanto quanto todos sabem, temos um widget de imagem, então colocamos o widget de imagem primeiro nesse ponto, colocamos o widget Filtro de pano de fundo como seu filho.

Para obter mais informações sobre o Widget de filtro de pano de fundo, assista a este vídeo por Flutter:

O vídeo de demonstração abaixo mostra como criar um efeito de desfoque em uma vibração. Ele mostra como o efeito de desfoque funcionará usando o widget BackdropFilter em seus aplicativos de vibração. Ele mostra três botões na tela central. Quando o usuário toca nesses botões, ele mostra o efeito de desfoque. Todos os três botões trabalham diferentes efeitos de desfoque. Ele será exibido no seu dispositivo.

Módulo de Demonstração:

Propriedades:

A lista de propriedades de backdrop filter você pode passar para o construtor.

  • Key key: A chave do widget, usada para controlar se deve ser substituída.
  • Filtro ImageFilter *: O filtro de imagem a ser aplicado ao conteúdo pintado existente antes de pintar o filho.
  • Widget child: O widget abaixo deste widget na árvore.

 

Implementação:

Etapa 1: Adicionar os recursos

Adicione recursos ao arquivo pubspec — yaml.

assets:
  - assets/

Etapa 2: Execute os pacotes flutter no diretório raiz do seu aplicativo.

Como implementar o código no arquivo dart:
Você precisa implementá-lo em seu código, respectivamente:

Crie um novo arquivo dart chamado home_page_screen.dart dentro da pasta lib.

Faremos três botões nesta tela da página inicial, e cada botão mostrará Backdrop Filter, e mostraremos os detalhes abaixo. Quando executamos o aplicativo, devemos obter a saída da tela como a captura de tela abaixo.

Vamos definir profundamente todos os botões

 

Desfoque de imagem:

Primeiro, vamos importá-lo de dart:ui.

import 'dart:ui';

Faremos um impacto de desfoque que será aplicado a todo o espaço do widget pai. Como BackdropFilter aplica o filtro à substância pintada atual, na maioria das vezes, precisamos utilizar o widget Stack para a execução. O widget onde o filtro será aplicado deve ser definido antes do filtro.

Stack(
  fit: StackFit.expand,
  children: <Widget>[
    Image.asset("assets/devs.png",fit: BoxFit.contain,),
    Positioned.fill(
      child: Center(
        child: BackdropFilter(
          filter: ImageFilter.blur(
            sigmaX: 10.0,
            sigmaY: 10.0,
          ),
          child: Container(
            color: Colors.black.withOpacity(0.2),

          ),
        ),
      ),
    ),
  ],
)

Como o filtro deve cobrir todo o espaço de seu pai, precisamos agrupar o widget BackdropFilter como filho de Positioned.fill. Você é obrigado a passar um ImageFilter. Para esta situação, o filtro mais adequado pode ser feito utilizando ImageFilter.blur. sigmaX e sigmaY controlam o desvio padrão dependente do filtro nos eixos x e y individualmente. Ambos têm uma estimativa padrão de 0, o que implica que nenhum impacto é aplicado. Para aplicar o filtro no eixo x, altere a estimativa de sigmaX para um número positivo. Para o eixo y, utilize a propriedade sigmaY. O filho de BackdropFilter pode ser um Container cuja opacidade de sombreamento é inferior a 1, sendo 0 um valor típico. Quando executamos o aplicativo, devemos obter a saída da tela como a captura de tela abaixo.

 

Desfoque de texto:

Este exemplo de Blur é como aplicar o filtro a um espaço específico da imagem. Em vez de Positioned. fill, utilize o construtor padrão do widget Positioned pelo qual você pode definir a separação da parte superior, esquerda, inferior e direita. De qualquer forma, isso não é adequado. Conforme compus acima, o Flutter aplicará o filtro a todos os espaços dentro do clipe do widget pai. Da mesma forma, para aplicar o canal em um território específico, você precisa agrupar BackdropFilter como filho de qualquer widget Clip, como ClipRect, ClipRRect, ClipOval, ClipPath ou CustomClipper.

      Stack(
        fit: StackFit.expand,
        children: <Widget>[
          Image.asset("assets/devs.png",fit: BoxFit.contain,),
          Positioned(
            top: 250,
            left: 0,
            right: 0,
            child: Center(
              child: ClipRRect(
                borderRadius: BorderRadius.circular(24),
                child: BackdropFilter(
                  filter: ImageFilter.blur(
                    sigmaX: 10.0,
                    sigmaY: 10.0,
                  ),
                  child: Container(
                    padding: EdgeInsets.all(24),
                    color: Colors.white.withOpacity(0.5),
                    child: Text(
                      "CapSistema",
                      style: TextStyle(
                        fontSize: 28,
                        fontWeight: FontWeight.bold,
                        color: Colors.white,
                      ),
                    ),
                  ),
                ),
              ),
            ),
          ),
        ],
      ),

 

Adicionaremos texto em um contêiner com a opacidade de cor e o raio da borda será circular devido a ClipRRect(). Quando executamos o aplicativo, devemos obter a saída da tela como a captura de tela abaixo.

 

Desfoque de imagem e texto:

Neste efeito de desfoque, todas as coisas serão iguais. Vamos adicionar Stack(), dentro vamos adicionar um widget Positioned com top, left e right. Aplicaremos BackdropFilter() e sua propriedade filha adicionaremos um container com o mesmo texto e cor com opacidade. Vamos remover ClipRRect. Todos os widgets ficarão desfocados.

Stack(
  fit: StackFit.expand,
  children: <Widget>[
    Image.asset("assets/devs.png",fit: BoxFit.contain,),
    Positioned(
      top: 250,
      left: 0,
      right: 0,
      child: Center(
        child: BackdropFilter(
          filter: ImageFilter.blur(
            sigmaX: 10.0,
            sigmaY: 10.0,
          ),
          child: Container(
            padding: EdgeInsets.all(24),
            color: Colors.white.withOpacity(0.5),
            child: Text(
              "CapSistema",
              style: TextStyle(
                fontSize: 28,
                fontWeight: FontWeight.bold,
                color: Colors.white,
              ),
            ),
          ),
        ),
      ),
    ),
  ],
),

Quando executamos o aplicativo, devemos obter a saída da tela como a captura de tela abaixo.

Arquivo de código:

import 'package:flutter/material.dart';
import 'package:flutter_backdrop_filter_widget/image_blur.dart';
import 'package:flutter_backdrop_filter_widget/image_text_blur.dart';
import 'package:flutter_backdrop_filter_widget/text_blur.dart';

class HomePageScreen extends StatefulWidget {
  @override
  _HomePageScreenState createState() => _HomePageScreenState();
}

class _HomePageScreenState extends State<HomePageScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xffFFFFFF),
      appBar: AppBar(
        title: Text("Flutter BackdropFilter Widget Demo"),
        automaticallyImplyLeading: false,
        centerTitle: true,
      ),
      body: Center(
          child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            ElevatedButton(
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.cyan[200],
                side: const BorderSide(width: 3, color: Colors.cyan),
                elevation: 3,
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.all(Radius.circular(20))),
                padding: EdgeInsets.all(13),
              ),
              child: Text(
                'Image Blur',
                style: TextStyle(color: Colors.black),
              ),
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (context) => ImageBlur()));
              },
            ),
            SizedBox(
              height: 8,
            ),
            ElevatedButton(
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.cyan[100],
                side: const BorderSide(width: 3, color: Colors.cyan),
                elevation: 3,
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.all(Radius.circular(20))),
                padding: EdgeInsets.all(13),
              ),
              child: Text(
                'Text Blur',
                style: TextStyle(color: Colors.black),
              ),
              onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (context) => TextBlur()));
              },
            ),
            SizedBox(
              height: 8,
            ),
            ElevatedButton(
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.cyan[100],
                side: const BorderSide(width: 3, color: Colors.cyan),
                elevation: 3,
                shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.all(Radius.circular(20))),
                padding: EdgeInsets.all(13),
              ),
              child: Text(
                'Image & Text Blur',
                style: TextStyle(color: Colors.black),
              ),
              onPressed: () {
                Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => ImageTextBlur()));
              },
            ),
            SizedBox(
              height: 8,
            ),
          ],
        ),
      )), //center
    );
  }
}

Conclusão:

No artigo, expliquei rapidamente a estrutura básica do Backdrop Filter Widget; você pode modificar este código de acordo com sua escolha. Esta foi uma pequena introdução ao Backdrop Filter Widget,  está funcionando usando o Flutter.

Espero que este blog forneça a você informações suficientes em Experimentando o widget Backdrop Filter em seus projetos de flutter. Mostraremos o que é o Backdrop Filter Widget ?, algumas propriedades usando no Backdrop Filter, e faremos um programa de demonstração para trabalhar com o Backdrop Filter Widget e mostraremos como usar esse widget para criar um efeito de desfoque usando o widget BackdropFilter em seus aplicativos flutter , Então, por favor, tente.

Link do projeto: (Link)