flutter中全局与单页面背景图片(动态图片)
单页面设置背景图片
使用 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()
],
),
));
}
}
return MaterialApp(
debugShowCheckedModeBanner: false, //去除debug图标
onGenerateRoute: onGenerateRoute,
home: Scaffold(
body: Stack(
children: [
Positioned.fill(
child: Image.asset(
'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: 图像将等比例缩放以适应容器的尺寸,但只有在图像的大小大于容器的尺寸时才会缩放。如果图像的大小小于或等于容器的大小,图像将被原样显示。
flutter中全局与单页面背景图片(动态图片)的更多相关文章
- Vue项目中设置每个单页面的标题
两种实现方法,第一种方法引入插件,第二种为编程方式实现(推荐) 首先在路由文件index.js中给每个单页面路由添加title routes: [{ path: '/', name: ...
- Flutter 中的表单
一.Flutter 常用表单介绍 Flutter 中常见的表单有 TextField 单行文本框,TextField 多行文本框.CheckBox.Radio.Switch CheckboxLi ...
- flutter中的表单使用
Flutter 中常见的表单有 TextField 单行文本框,TextField 多行文本框.CheckBox.Radio.Switch.CheckboxListTile.RadioListTile ...
- 详解H5中的history单页面,手动实现单页面开发,细说h5单页面原理
就目前来看,前端的单页面开发占了很大一部分,一方面无刷新的切换增强了体验,并且浏览器记录依然存在,前进后退都没问题,在之前我们通地址栏中的hash改变来触发onhashchange方法来实现单页面应用 ...
- 25.Flutter中的表单 Radio RadioListTile Switch SwitchListTile 以及表单组件实现一个简单的学员登记系统(下)
四.Radio.RadioListTile单选按钮组件 Radio常用属性: value单选的值. onChanged改变时触发. activeColor:选中的颜色.背景颜色 groupValue: ...
- Vue修改单页面背景颜色
- javaweb页面上展示动态图片
HTML <img alt="点击设定" name="CONSTRUCTIONPLANHIS_IMAGE_curr_img_0" src="vi ...
- EXTJS4.0 显示图片 动态图片
在网上找了好久没有好的解决方法 都是用 'box' 什么的组件 改写的 autoEl 好麻烦,修改 好的属性都不能用.弄了好久没弄成 最后: 用panel 显示 html 文本 追加 ‘'<i ...
- vue单页面引入CDN链接
不想在index.html文件中全局引入CDN资源,那么如何在Vue单文件组件中引入?下面来瞅瞅~ 虚拟DOM创建 Vue 通过创建一个虚拟 DOM 来追踪自己要改变的真实 DOM 什么是虚拟DOM? ...
- [后端人员耍前端系列]KnockoutJs篇:使用WebApi+Bootstrap+KnockoutJs打造单页面程序
一.前言 在前一个专题快速介绍了KnockoutJs相关知识点,也写了一些简单例子,希望通过这些例子大家可以快速入门KnockoutJs.为了让大家可以清楚地看到KnockoutJs在实际项目中的应用 ...
随机推荐
- Redis——Redis面试题
文章目录 概述 什么是Redis Redis有哪些优缺点 为什么要用 Redis /为什么要用缓存 为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 数据类型 Re ...
- 研发三维GIS系统笔记/实现wgs84投影-001
1. 工作内容,改造引擎,支持wgs84投影 改造原因:目前投影是墨卡托投影(与Google Map一致) 目前的GIS系统是二维的采用这个坐标系是没有问题的 但不支持wgs84瓦片数据以及高程数据, ...
- 如何在Excel中实现三联类模板?
本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在一些报表打印应用场景中,会有类似于如下图所示的排版格式: 一般情况下 ...
- CSS属性 Position的几种定位方式
作者:WangMin 格言:努力做好自己喜欢的每一件事 在讲几种定位方式之前,我们先来了解一下什么是普通流(normal flow)? 除非专门指定,否则所有框都在普通流中定位.普通流中元素框的位置由 ...
- canvas实现动态替换人物的背景颜色
起因 今天遇见一个特别有意思的小功能. 就是更换人物图像的背景颜色. 大致操作步骤就是:点击人物-实现背景颜色发生变化 将图片绘画到canvas画布上 我们需要将图片绘制到canvas画布上. 这样做 ...
- Codeforces Round #696 (Div. 2) (A~C题解)
写在前边 链接:Codeforces Round #696 (Div. 2) A. Puzzle From the Future 链接:A题链接 题目大意: 给定一个\(a\),\(b\),\(d = ...
- Vue公共loading升级版(处理并发异步差时响应)
公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤: 1.通过全局状态管理定义状态值(vuex.pinia等). 2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画. ...
- 如何使用Tampermonkey开发并使用一个浏览器脚本
准备工作 简介 Tampermonkey 是一款强大的浏览器扩展,它允许您定制网页的行为,改变和优化网页的展示方式或者功能以满足个人需求.通过编写自定义脚本,您可以实现许多有趣的功能,从自动化任务到改 ...
- 机密计算如何引领AI开发的安全未来
机密计算如何引领AI开发的安全未来 PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 先进的AI模型比如机器学习和 ...
- Codeforces Round #691 (Div. 2) D - Glass Half Spilled(DP)
题目 补下因实验漏掉的CF(还以为是晚上,没想到是下午开始).前三题过的很顺利,到D题时想了会发现数据很小爆搜貌似能过,就以为是道水题,交了一发T了,胡乱加了点剪枝还是T.逐渐意识到事情的严重性.考虑 ...