【问题标题】:Masked Blur for Image图像蒙版模糊
【发布时间】:2020-05-05 12:26:42
【问题描述】:

我想实现如下所示的效果,其中图像的大部分部分被模糊,只有图像中有趣的部分显示清晰(带边框)。

我不确定如何实现效果,并想考虑您的想法。模糊图像不是问题(我正在按照here 的描述进行操作),但是让图像的一部分不模糊是一个很大的挑战。我考虑过将两张图像(一张模糊,一张非模糊)叠加在一起。但是,这将不起作用,因为模糊的图像会在剪切部分上投下阴影。

我也尝试使用 CustomPainter,但是我无法让模糊效果正常。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    这个是怎么做的,想法是让CustomClipper反转BackDropFilter.的行为

    import 'dart:ui';
    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.green,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SizedBox(
            height: 250,
            child: Stack(
    
              children: <Widget>[
                Center(
                    child: Image.network(
                        'https://cdn-prod.medicalnewstoday.com/content/images/articles/322/322736/elephant-from-the-front.jpg')),
                Center(
                  child: ClipPath(
                    clipper: InvertedRect(),
                    child: BackdropFilter(
                      filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
                      child:   Container(
                        color: Colors.transparent,
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    class InvertedRect extends CustomClipper<Path> {
      @override
      getClip(Size size) {
        print(size);
        return Path()
          ..addRect(Rect.fromLTWH(0.0, 0.0, size.width, size.height))
          ..addRect(Rect.fromLTWH(100.0, 40.0, 100, 100))
          ..fillType = PathFillType.evenOdd;
      }
    
      @override
      bool shouldReclip(CustomClipper<Path> oldClipper) => true;
    }
    

    【讨论】:

    • 感谢您提供这个简单有效的解决方案。使用这种方法,使用 Custom Painter 应用矩形同样容易。
    • @Jens 所以如果你需要CustomPainter 那么为什么不把所有的东西都画进去呢?这样你只需要一个小部件:CustomPaint - 你运行了我发布的代码吗?如果有,还有什么不清楚的地方?
    • @pskink 你有一个完全正确的观点,我会在重构代码时研究你的方法,然后决定哪个更适合我(但它可能是你的)。现在我很高兴 Saed 提供的解决方案有效。
    • @pskink 抱歉,我正在度假,只是想试试你的代码,但我猜你删除了它?如果您想分享您的代码,请将其作为答案提交,我一定会检查出来!
    • 你好@pskink 这是Saed Nabil,我认为我们不需要使用自定义绘画来绘制简单的红色矩形,您只需使用带有边框和透明颜色的容器即可。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多