【问题标题】:Gradient on top of blurred image (flutter)模糊图像顶部的渐变(颤动)
【发布时间】:2020-09-12 19:56:59
【问题描述】:

我想要一个像第二个屏幕截图中那样带有褪色背景的设计。所以模糊背景图像的上半部分已经很好,只是下半部分缺少渐变到固定颜色(如黑色或白色)。

为了澄清:我只希望背景淡入黑色而不影响顶层(在这种情况下是未触及的图像)。我现在尝试了很长时间以获得合适的解决方案,但不幸的是我没有找到任何解决方案。

当前状态:

目标:

当前代码(第一张截图):

Container(
 color: Colors.white,
 child: Container(
  decoration: BoxDecoration(
    image: DecorationImage(
      image: CachedNetworkImageProvider(widget.storyData.coverURL),
      fit: BoxFit.cover,
    ),
  ),
  child: BackdropFilter(
    filter: ImageFilter.blur(sigmaX: 30, sigmaY: 30),
    child: Container(
      child: Padding(
        padding: const EdgeInsets.all(80.0),
        child: Hero(
          tag: widget.heroTagID,
          child: CachedNetworkImage(
            imageUrl: widget.storyData.coverURL,
            placeholder: (context, url) => Padding(
              padding: EdgeInsets.all(25),
              child: Icon(Ionicons.image_outline),
            ),
          ),
        ),
      ),
    ),
  )),
);

【问题讨论】:

    标签: flutter dart flutter-layout gaussianblur


    【解决方案1】:

    您可以使用StackLinearGradient 来实现。

    我已将 CachedNetworkImageProvider 替换为简单的 NetworkImage,以便代码可以在 https://dartpad.dev/ 上运行。原理还是一样的:

    import 'dart:ui';
    import 'package:flutter/material.dart';
    
    final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            body: Center(
              child: MyWidget(),
            ),
          ),
        );
      }
    }
    
    class MyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Stack(
          children: <Widget>[
            Container(
              decoration: BoxDecoration(
                image: DecorationImage(
                  image: NetworkImage(
                    'https://picsum.photos/id/255/1440/3200',
                  ),
                  fit: BoxFit.cover,
                ),
              ),
            ),
            Container(
              constraints: BoxConstraints.expand(),
              decoration: BoxDecoration(
                  color: Colors.white,
                  gradient: LinearGradient(
                      begin: FractionalOffset.topCenter,
                      end: FractionalOffset.bottomCenter,
                      colors: [Colors.black.withOpacity(0.0), Colors.black],
                      stops: [0.0, 1.0]
                  )
              ),
            ),
            BackdropFilter(
                filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
                child: Center(
                  child: Padding(
                    padding: const EdgeInsets.all(80.0),
                    child: Hero(
                        tag: 'heroTag',
                        child: Image.network(
                          'https://picsum.photos/id/255/1440/3200',
                        )
                    ),
                  ),
                )
            ),
          ],
        );
      }
    }
    

    您可以调整颜色和停止以获得您想要的颜色。

    最终结果:

    【讨论】:

    • 您可以删除第二个容器,只需将线性渐变作为foregoundDecoration 添加到第一个容器
    • 感谢你们俩。正是我搜索的内容:-)
    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2020-12-30
    • 2020-04-29
    • 1970-01-01
    • 2012-03-05
    • 2020-12-21
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多