Bagaimana cara melakukan efek "kaca buram" di Flutter?

100

Saya sedang menulis aplikasi Flutter, dan saya ingin menggunakan / menerapkan efek "kaca buram" yang umum di iOS. Bagaimana saya melakukan ini?

Seth Ladd
sumber
1
Saya menulis artikel untuk menunjukkan bagaimana membuat efek blur pada Flutter dengan menggunakan BackdropFilter & ImageFilter - baca di Medium
anticafe
Anda dapat menggunakan paket blurrycontainer .
Jon

Jawaban:

173

Anda dapat menggunakan widget BackdropFilter untuk mendapatkan efek ini.

tangkapan layar

import 'dart:ui';
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(home: new FrostedDemo()));
}

class FrostedDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Stack(
        children: <Widget>[
          new ConstrainedBox(
            constraints: const BoxConstraints.expand(),
            child: new FlutterLogo()
          ),
          new Center(
            child: new ClipRect(
              child: new BackdropFilter(
                filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
                child: new Container(
                  width: 200.0,
                  height: 200.0,
                  decoration: new BoxDecoration(
                    color: Colors.grey.shade200.withOpacity(0.5)
                  ),
                  child: new Center(
                    child: new Text(
                      'Frosted',
                      style: Theme.of(context).textTheme.display3
                    ),
                  ),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}
Collin Jackson
sumber
Bagaimana cara membuat efek buram menutupi seluruh lebar / tinggi aplikasi?
Pieter
2
atau, jika Anda mencoba menggunakan efek kaca buram sebagai penghalang modal untuk dialog, Anda dapat memodifikasi salinan ModalBarrier Anda untuk menyertakan BackdropFilter. github.com/flutter/flutter/blob/master/packages/flutter/lib/src/…
Collin Jackson
Sayangnya, efek blur tidak berfungsi pada perangkat iOS: github.com/flutter/flutter/issues/10284
Tandai
3
iirc, masalah di atas telah diselesaikan dan efek blur berfungsi pada perangkat iOS sekarang :)
loganrussell48
13

Saya rasa saya tidak tahu arti sebenarnya dari 'Frosted' (Jika contoh saya tidak berhasil di sini),

import 'package:flutter/material.dart';
import 'dart:ui' as ui;

void main() => runApp(
    MaterialApp(
        title: "Frosted glass",
        home: new HomePage()
    )
);

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Stack(
        fit: StackFit.expand,
        children: <Widget>[
          generateBluredImage(),
          new Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              rectShapeContainer(),
            ],
          ),
        ],
      ),
    );
  }

  Widget generateBluredImage() {
    return new Container(
      decoration: new BoxDecoration(
        image: new DecorationImage(
          image: new AssetImage('assets/images/huxley-lsd.png'),
          fit: BoxFit.cover,
        ),
      ),
      //I blured the parent container to blur background image, you can get rid of this part
      child: new BackdropFilter(
        filter: new ui.ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
        child: new Container(
          //you can change opacity with color here(I used black) for background.
          decoration: new BoxDecoration(color: Colors.black.withOpacity(0.2)),
        ),
      ),
    );
  }

  Widget rectShapeContainer() {
    return Container(
      margin: const EdgeInsets.symmetric(horizontal: 40.0, vertical: 10.0),
      padding: const EdgeInsets.all(15.0),
      decoration: new BoxDecoration(
        //you can get rid of below line also
        borderRadius: new BorderRadius.circular(10.0),
        //below line is for rectangular shape
        shape: BoxShape.rectangle,
        //you can change opacity with color here(I used black) for rect
        color: Colors.black.withOpacity(0.5),
        //I added some shadow, but you can remove boxShadow also.
        boxShadow: <BoxShadow>[
          new BoxShadow(
            color: Colors.black26,
            blurRadius: 5.0,
            offset: new Offset(5.0, 5.0),
          ),
        ],
      ),
      child: new Column(
        children: <Widget>[
          new Text(
            'There\'s only one corner of the universe you can be certain of improving and that\'s your own self.',
            style: new TextStyle(
              color: Colors.white,
              fontSize: 20.0,
            ),
          ),
        ],
      ),
    );
  }
}

Hasil:

masukkan deskripsi gambar di sini

Saya harap ini akan membantu seseorang.

Blasanka
sumber
1
sangat membantu. Benar-benar lupa tentang opsi 'Stack' ... terima kasih banyak.
AhabLives
bagaimana Anda bisa membuat frosting mengikuti bentuk wadah induk? itu masih menunjukkan persegi panjang ketika ditambahkan di dalam wadah berbentuk lingkaran
Kaki Master Of Time
@KakiTime Saya rasa saya tidak mendapatkan pertanyaan Anda dengan benar. Tetapi jika Anda membuat bentuk wadah rectShape menjadi lingkaran dengan menghapus borderRadius itu akan berhasil.
Blasanka
1
Saya suka kutipannya :-)
santanu bera
0
BackdropFilter(
  filter: ImageFilter.blur(sigmaX: _sigmaX, sigmaY: _sigmaY),
  child: Container(
    color: Colors.black.withOpacity(_opacity),
  ),
),
Mahmoud Hamdy
sumber