Flutter 中实现磨砂玻璃效果

原文 https://medium.com/@aihrarshaikh1208/how-to-achieve-glassmorphism-in-flutter-90be07a32788?source=topics_v2---------0-84----------flutter-------31---c979621e_c72a_41fe_a3f7_8f860ce7fa58-------17

前言

这就是我们今天将在这个博客中创建的内容:

正文

Glassmorphism 磨砂玻璃

“磨砂玻璃”是一种使用 Flutter widget 库的用户界面设计趋势。它已经为 UI 模式和样式的变化以及各种不断发展的样式做好了充分的准备。受到许多开发团队影响的 UI Glassformism 已经成为最热门的 UI 模式之一。在 Glassformism 卡片中,我们模糊了 UI 的背景,同时通过多层方法将该过滤器应用到虚拟玻璃上,使其看起来好像项目在空间中掠过。这种模式已经变得越来越流行,因为它是一个来自 Flutter 的开源 UI 开发工具包,可以用于不同平台的 UI 设计。

Flutter

Flutter 是 Google 的一个开源框架,用于从单个代码库构建漂亮的、本地编译的、多平台的应用程序。 Flutter 应用程序的基本构件称为 widget 。这些 widget 是 Flutter 框架中的 center 类层次结构。

开始吧

在 android 工作室中启动一个新的 Flutter 项目,您将看到 main.dart 文件中的一些样板代码。将 main.dart 文件更改为下面的给定代码。

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:blog_1/glasscomponent.dart';
void main(){
  runApp(const MaterialApp(
      debugShowCheckedModeBanner: false,
      home : App()));
}
class App extends StatelessWidget {
  const App({Key? key}) : super(key: key);
  
  Widget build(BuildContext context) {
    return
      Scaffold(
          body: Container(
              height: MediaQuery.of(context).size.height,
              width: MediaQuery.of(context).size.width,
              decoration: const BoxDecoration(
                image: DecorationImage(
                    image:AssetImage("assets/bg.png"),
                    fit: BoxFit.fill
                ),
              ),
              child: GlassComponent()
          )
      );
  }
}

scaffold 脚手架类为应用程序提供了基本的 Material 设计布局。脚手架还提供诸如 Drawer、 SnackBar、 BottomNavigationBar、 FloatingActionButton 和 AppBar 等 widget 。在 Saffold 的主体中定义一个将 extension 到整个屏幕的 container 。要获得屏幕大小,可以使用 MediaQuery,它提供了当前应用程序屏幕大小的更高级视图,还可以提供关于设备及其布局首选项的更详细信息。添加一个网络图像或资产图像这将是你的背景,按照这个链接的信息有关图像在 Flutter 按照这个指南。

https://docs.flutter.dev/development/ui/assets-and-images

在 lib 文件夹中创建一个名为 glasscardcomponent.dart 的新文件。首先,我们将使用 Center widget 集中我们将要进一步添加的所有组件

import 'dart:ui';
import 'package:flutter/material.dart';
class GlassComponent extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(24),
            border: Border.all(color: Colors.white.withOpacity(0.3),width: 1)
        ),
        margin: const EdgeInsets.all(18),
        height: MediaQuery.of(context).size.height/3.5,
        width: MediaQuery.of(context).size.width,
        child: ClipRRect(
          borderRadius: BorderRadius.circular(24),
          child: BackdropFilter(
              filter: ImageFilter.blur(sigmaX: 30, sigmaY: 30),
              child: Stack(
                children: [
                  Positioned(
                    top: 20,
                    left:20,
                    child:  Container(
                      height: 40,
                      width: 60,
                      child: Image(
                              image:
                NetworkImage("https://logodix.com/logo/1153467.png"),
                      ),
                    ),
                  ),
                  Positioned(
                    bottom: 75,
                    left: 20,
                    child: Text("4204   4208   0085   8008", style:
                    TextStyle(
                        color: Colors.white.withOpacity(0.80),
                        fontSize: 22,
                        letterSpacing: 2
                    ),),
                  ),
                  Positioned(
                    bottom: 40,
                    left: 20,
                    child: Text("AIHRAR SHAIKH",style: TextStyle(
                      color: Colors.white.withOpacity(0.50),
                      fontSize: 14,
                    ),
                    ),
                  ),
                  Positioned(
                    bottom: 40,
                    right: 32,
                    child: Text("EXPIRY 02/04",style: TextStyle(
                      color: Colors.white.withOpacity(0.50),
                      fontSize: 14,
                    ),
                    ),
                  )
                ],
              )
          ),
        ),
      ),
    );
  }
}

设置 BoxDecoring 的 borderRadius、镶边、高度和重量,创建一个带有弯曲角的基本矩形组件。我们使用 BackdroFilter widget 的 ImageFilter.blur 属性来创建玻璃卡效果。SigmaX 和 sigmaY 参数分别用于改变水平和垂直方向的模糊偏差((sigmaX: 0,sigmaY: 0)将代表默认组件)。BackdroFilter 没有 borderRadius 属性,所以我们将用 Cliprresponse 包装它。

恭喜你已经创建了磨砂玻璃效果,现在只需要在你的卡片上添加你的数据。我使用的堆栈和定位 widget 布局的数据,你也可以使用行和列的组合,以实现同样的。

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

祝你有一个美好的一天~

猫哥课程


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://ducafecat.com

Last Updated:
Contributors: ducafecat