首页 > 其他分享 >flutter中背景图片(动态图片)

flutter中背景图片(动态图片)

时间:2023-12-25 15:00:26浏览次数:48  
标签:容器 const 背景图片 图像 动态 flutter BoxFit 页面

单页面设置背景图片

使用 Container 组件和 decoration 属性:

优点:简单易用,适用于大多数情况下的页面背景设置。

缺点:无法控制背景图片的位置和层级。

class MyBook extends StatelessWidget {
  const MyBook({super.key});

  @override
  Widget build(BuildContext context) {
    return Container(
      width: MediaQuery.of(context).size.width, // 指定图片的宽度
      height: MediaQuery.of(context).size.height,
      decoration: const BoxDecoration(
        image: DecorationImage(
          // image: AssetImage('images/backbode/back1.png'), //静态
           image: AssetImage('images/backbode/gif/game_back3.webp'), //动态
          fit: BoxFit.cover,
        ),
      ),
      child: const Text("我的书籍"),
    );
  }
}
使用 Stack 组件将背景图片放在页面最底层:

优点:可以将背景图片置于页面最底层,不会被其他组件遮挡。

缺点:需要使用 Positioned.fill 或自定义位置来调整背景图片的尺寸和位置。

class MyBook extends StatelessWidget {
  const MyBook({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          Positioned.fill(
            child: Image.asset(
              'images/backbode/gif/game_back3.webp',
              fit: BoxFit.cover,
            ),
          ),
          const Align(//必须加背景才全屏
              // alignment: Alignment.center,
              child: Text("我的书籍")),
        ],
      ),
    );
  }
}
自定义页面的 Scaffold 组件的 body 属性,并设置 Container 组件作为背景:

优点:直接在页面的 Scaffold 中设置背景图片,方便管理页面布局。

缺点:在较复杂的页面布局中可能需要调整 Stack 的层级。

class MyBook extends StatelessWidget {
  const MyBook({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        width: double.infinity,
        height: double.infinity,
        decoration: const BoxDecoration(
          image: DecorationImage(
            image: AssetImage('images/backbode/gif/game_back3.webp'),
            fit: BoxFit.cover,
          ),
        ),
        child: const Text("我的书籍"),
      ),
    );
  }
}

全局设置背景图片

使用Flutter中的Stack小部件实现了全局背景图片的效果:

优点:灵活性高:通过使用Stack小部件,您可以将背景图片放置在整个屏幕下面,并在其上方叠加其他小部件。这样,您可以更自由地控制页面的布局和结构。可扩展性强:由于背景图片是作为Stack的一部分添加的,所以您可以随时添加更多的小部件到Stack中,来增强页面的功能和交互。

缺点:性能影响:由于背景图片会覆盖整个屏幕,所以对于较大分辨率的屏幕或包含大量小部件的页面,图片加载和布局可能会影响性能。在这种情况下,建议对图片进行优化,避免使用过大的图片以及尽可能减少布局计算等操作。需要额外的布局层级:由于需要使用Stack来放置背景图片和其他小部件,这意味着页面会增加一个额外的布局层级。对于简单页面来说,这可能不是一个问题,但对于复杂的页面结构,可能需要更多的布局层级来实现所需的效果。

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // 禁用状态栏和导航栏
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);

    // 强制横屏
    SystemChrome.setPreferredOrientations(
        [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);

    return MaterialApp(
        debugShowCheckedModeBanner: false, //去除debug图标
        home: Scaffold(
          body: Stack(
            children: [
              Container(
                decoration: const BoxDecoration(
                  image: DecorationImage(
                    // image: AssetImage('images/backbode/back1.png'), // 全局设置背景图片
                    image: AssetImage(
                        'images/backbode/gif/game_back3.webp'), // 全局设置动态背景图片
                    fit: BoxFit.cover,
                  ),
                ),
              ),
              // 在这里添加其他小部件
              MyHome()
            ],
          ),
        ));
  }
}
使用 MaterialApp 组件的 builder 属性和 Navigator 的 Observer 在路由跳转时统一设置背景图片:

优点:可以实现在路由跳转时统一设置背景图片,适用于需要动态更改背景图片的场景。

缺点:需要实现自定义的路由管理器,相对复杂。

 

 

BoxFit的不同值以及它们的用法说明

  • BoxFit.contain: 图像将等比例缩放以适应容器的尺寸,同时保持图像的完整性。这意味着图像可能会在容器内留有空白区域,图像的某些部分可能不会完全显示。
  • BoxFit.cover: 图像将等比例缩放以填充整个容器的尺寸,然后将超出部分裁剪掉。这意味着图像可能会在容器中进行裁剪,以适应容器的尺寸。
  • BoxFit.fill: 图像将拉伸和变形以填充整个容器的尺寸。这意味着图像可能会拉伸或压缩,以适应容器的尺寸,导致图像可能失真。
  • BoxFit.fitHeight: 图像将等比例缩放以在垂直方向上填充整个容器的高度,然后根据原始图像的宽高比来调整宽度。这意味着图像可能会在容器中进行裁剪,以适应容器的尺寸。
  • BoxFit.fitWidth: 图像将等比例缩放以在水平方向上填充整个容器的宽度,然后根据原始图像的宽高比来调整高度。这意味着图像可能会在容器中进行裁剪,以适应容器的尺寸。
  • BoxFit.none: 图像将不进行缩放,而是根据容器的尺寸进行定位显示。如果图像的尺寸大于容器的尺寸,图像可能会被裁剪掉。
  • BoxFit.scaleDown: 图像将等比例缩放以适应容器的尺寸,但只有在图像的大小大于容器的尺寸时才会缩放。如果图像的大小小于或等于容器的大小,图像将被原样显示。

标签:容器,const,背景图片,图像,动态,flutter,BoxFit,页面
From: https://www.cnblogs.com/xbinbin/p/17913673.html

相关文章

  • SpringBoot 这么实现动态数据源切换,就很丝滑!
    大家好,我是小富~简介项目开发中经常会遇到多数据源同时使用的场景,比如冷热数据的查询等情况,我们可以使用类似现成的工具包来解决问题,但在多数据源的使用中通常伴随着定制化的业务,所以一般的公司还是会自行实现多数据源切换的功能,接下来一起使用实现自定义注解的形式来实现一下。......
  • .NET中反射和动态表达式的分析和比较
    背景在.NET中,反射和动态表达式是两种常用的动态编程技术。它们都可以用来在运行时动态地创建和操作对象、调用方法、访问属性和字段等。但是,它们在性能方面有一些差异。反射:反射是.NET中的一种基础技术,可以用来获取程序集、类型、方法、属性、字段等的元数据,以及动态地创建对......
  • Flutter中 关于package:flutter/cupertino.dart和package:flutter/material.dart的区
    import'package:flutter/cupertino.dart';和import'package:flutter/material.dart';这两个语句分别用于导入Flutter框架中的不同部分,而且它们通常用于创建不同风格的用户界面。1.import'package:flutter/material.dart';:这是导入Material部分的语句,Material是一种设计......
  • flutter 桌面通知 气泡消息数量
    先上效果原理Android操作系统提供的NotificationManager接口来设置应用程序图标上的徽章iOS操作系统提供的UIApplication.shared.applicationIconBadgeNumber使用flutterflutterpubaddflutter_app_badger通过在启动退出时候更新气泡import'package......
  • 在Flutter中使用PhotoViewGallery指南
    介绍Flutter中的PhotoViewGallery是一个功能强大的插件,用于在应用中展示可缩放的图片。无论是构建图像浏览器、相册应用,还是需要在应用中查看大图的场景,PhotoViewGallery都是一个不错的选择。添加依赖首先,需要在pubspec.yaml文件中添加photo_view插件的依赖。打开该文件,然后在depen......
  • 如何实现分布式环境下的动态配置管理?
    随着分布式系统和微服务架构的持续发展,对系统中存在的各种服务和资源进行统一治理已经成为系统架构设计过程中的一个基础要点。ShardingSphere作为一款分布式数据库中间件,同样集成了编制治理方面的功能。如何使用ShardingSphere所提供的编排治理功能进行展开,先讨论ShardingS......
  • Flutter 显式动画
    创建AnimationController的同时,也赋予了一个vsync参数。vsync的存在防止后台动画消耗不必要的资源。您可以通过添加SingleTickerProviderStateMixin到类定义,将有状态的对象用作vsync因为addListener()函数调用setState(),所以每次Animation生成一个新的数字,当前帧......
  • Flutter-Dart中(){}和()=>{}的细微区别
    ()=>{}在Dart语言中,=>符号是箭头语法的一部分,它用于创建单行函数或表达式的缩写。在你的两个例子中,使用()=>和(){}都是合法的,但有细微的区别。()=>箭头函数(Arrowfunction):这是一种简写形式,适用于只有一条语句的函数体。在这种情况下,函数体的结果就是函数的返回值。示例:on......
  • R语言经济学:动态模型平均(DMA)、动态模型选择(DMS)预测原油价格时间序列
    原文链接:http://tecdat.cn/?p=22458 原文出处:拓端数据部落公众号 简介本文提供了一个经济案例。着重于原油市场的例子。简要地提供了在经济学中使用模型平均和贝叶斯方法的论据,使用了动态模型平均法(DMA),并与ARIMA、TVP等方法进行比较。希望对经济和金融领域的从业人员和研究......
  • Android平台RTSP流如何添加动态水印后转推RTMP或轻量级RTSP服务
    技术背景我们在对接外部开发者的时候,遇到这样的技术诉求,客户用于地下管道检测场景,需要把摄像头的数据拉取过来,然后叠加上实时位置、施工单位、施工人员等信息,然后对外输出新的RTSP流,并本地录制一份带动态水印叠加后的数据。整个过程,因为摄像头位置一直在变化,所以需要整体尽可能的低......