Làm cách nào để tạo hiệu ứng "kính mờ" trong Flutter?


99

Tôi đang viết một ứng dụng Flutter và tôi muốn sử dụng / triển khai hiệu ứng "kính mờ" phổ biến trên iOS. Làm thế nào để tôi làm điều này?


1
Tôi viết một bài báo để hiển thị như thế nào để làm cho hiệu ứng mờ ảo trên Flutter bằng cách sử dụng BackdropFilter & imagefilter - đọc nó trên Medium
anticafe

Bạn có thể sử dụng gói blurrycontainer .
Jon

Câu trả lời:


172

Bạn có thể sử dụng tiện ích BackdropFilter để đạt được hiệu ứng này.

ảnh chụp màn hình

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

Làm cách nào để tạo hiệu ứng mờ bao phủ toàn bộ chiều rộng / chiều cao của ứng dụng?
Pieter


2
hoặc, nếu bạn đang cố gắng sử dụng hiệu ứng kính mờ làm rào cản phương thức cho hộp thoại, bạn có thể sửa đổi bản sao ModalBarrier của mình để bao gồm BackdropFilter. github.com/flutter/flutter/blob/master/packages/flutter/lib/src/…
Collin Jackson

Rất tiếc, hiệu ứng làm mờ không hoạt động trên thiết bị iOS: github.com/flutter/flutter/issues/10284
Đánh dấu

3
iirc, vấn đề trên đã được giải quyết và hiệu ứng làm mờ hoạt động trên các thiết bị iOS ngay bây giờ :)
loganrussell48

11

Tôi nghĩ rằng tôi không biết ý nghĩa chính xác của 'Frosted' (Nếu ví dụ của tôi không hoạt động ở đây),

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

Kết quả:

nhập mô tả hình ảnh ở đây

Tôi hy vọng điều này sẽ giúp một ai đó.


1
hoàn toàn được giúp đỡ. Hoàn toàn quên về tùy chọn 'Ngăn xếp' ... cảm ơn rất nhiều.
AhabLives

làm thế nào bạn có thể làm cho lớp phủ theo hình dạng của thùng chứa mẹ? nó vẫn hiển thị hình chữ nhật khi thêm vào bên trong một container hình tròn
Kaki Thạc sĩ Of Time

@KakiMasterOfTime Tôi nghĩ rằng tôi không hiểu đúng câu hỏi của bạn. Nhưng nếu bạn tạo hình dạng vùng chứa trực tràng thành hình tròn bằng cách loại bỏ borderRadius thì nó sẽ hoạt động.
Blasanka

1
Tôi thích câu trích dẫn :-)
santanu bera

0
BackdropFilter(
  filter: ImageFilter.blur(sigmaX: _sigmaX, sigmaY: _sigmaY),
  child: Container(
    color: Colors.black.withOpacity(_opacity),
  ),
),
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.