我们看一下简单的代码
类_MyHomePageState 扩展状态{
ImageInfo信息//图像信息;
List BlendModes=BlendMode.values //所有混合模式转换为列表。
@覆盖
无效DidChangeDependency(){
super.didChangeDependency();
Image.asset(\”图片/yuan.png\”)
。图像
.resolve(createLocalImageConfiguration(上下文))
.addListener((ImageInfo 图像, bool synchronousCall) {
设置状态((){
info=image //更新状态。
});
});
}
@覆盖
构建小部件(BuildContext 上下文){
返回脚手架(
body: GridView.builder(
itemCount: BlendModes.length – 1,
padding: EdgeInsets.only(top: 10.0),
GridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
),
itemBuilder: getItemBuilder,
),
);
}
Widget getItemBuilder(BuildContext context, int index) {
返回列(
儿童: [
原始图像(
image:信息?图片,
color: 颜色.红色,
宽度: 40,
身高: 40、
colorBlendMode: 混合模式[索引+ 1],
fit: 盒子fit.cover,
),
容器(
padding: EdgeInsets.only(top: 10.0),
child: 文本(
混合模式[index + 1].toString().split(\”.\”)[1],
style: 文本样式(
color: 颜色.黑色,
字体大小: 15.0,
),
),
),
],
);
}
}
Flutter的混合模式是枚举,与Android的图像混合模式和画笔混合模式基本相同。上面的代码描述了所有混合模式并包括插图,但不包括清除(清除模式清除所有内容)。该图像是一个简单的图像,显示带有透明通道的绿色圆圈。这是您在dst 模式下看到的内容,具有纯红色背景,以及您在src 模式下看到的内容。
fit属性使用的是Boxfit的枚举值,看一下效果:
fill
填充直到填满,忽略原始纵横比
contain
包括。将整个图像包含在容器中,而不改变原始比例。容器的额外部分填充有背景。
cover
覆盖。显示图像填充容器而不改变原始比例,裁剪图像的多余部分///
fitWidth
水平图像填充
fitHeight
垂直图像填充
![](https://user-gold-cdn.xitu.io/2018/12/1
2/167a08fb487b81b1?imageView2/0/w/1280/h/960/忽略错误/1)
none
中心原始尺寸
scaleDown
如果图片尺寸小于容器,则如果图片尺寸大于容器,则通过减小图片尺寸来实现。
centerSlice属性专门用于9个补丁文件。
其他属性我暂时不谈。
一般情况下,很少使用该控件,但应该提及和讨论它,因为它构成了实现其他Image 控件的基础。
Image
这是一个通用包装类,它包装RawImage 并提供方便的命名构造函数以使用AssetsImage、ExactAssetImage 和其他ImageProvider 子类。
Image,从ImageProvider获取图片显示
使用该类与RawImage基本相同;使用时只需将参数ui.Image包装到ImageProvider中即可,不需要自己监听ImageStream。典型的简单用法:
小部件图像=Image(AssetImage(“images/yuan.png”))
Image.asset,从asset资源中获取图片显示
该方法是使用AssetImage的ImageProvider的简单方法。
小部件图像=Image.asset(\”images/yuan.png\”)
Image.network,从URL获取网络图像显示
该方法是使用NetworkImage的ImageProvider的简单方法。
小部件图像=Image.network(\”http://img.rangaofei.cn/01b18.jpg\”)
Image.file,从文件中获取图像显示
这个方法只是FileImage的ImageProvider的一个使用。
小部件图像=Image.file(文件)
Image.memory 从内存中检索要显示的图像。
该方法是MemoryImage的ImageProvider的简单用法。
小部件图像=Image.memory(byteList)
CircleAvatar
主要用于显示用户的头像,任何照片都会被裁剪成圆形。
易于使用:
圆形头像(
child: Text(\”头像\”),
背景图片: AssetImage(“images/yuan.png”),
背景颜色: Colors.red,
半径: 50.0,
),
结果图像如下所示。
CircleAvatar 有许多内置功能。半径用于控制图像的大小。同时,它会自动感知当前主题是白天模式还是夜间模式并切换图像颜色。此外,它实际上包装了AnimatedContainer 和设置的动画。时间为200ms。更改某些关联属性时会自动使用动画。看一下简单的动画。
代码将如下所示:
类_MyHomePageState 扩展状态{
乘以半径=10.0;
@覆盖
无效初始化状态(){
super.initState();
Future.layed(持续时间(毫秒: 2 * 1000), () {
设置状态((){
半径=20.0;
});
返回时间(ms : 210);
}).then((周期d) {
Future.Delay(d, () {
设置状态((){
半径=40.0;
});
返回时间(ms : 210);
}).then((周期d) {
Future.Delay(d, () {
设置状态((){
半径=30.0;
});
});
});
;
});
}
@覆盖
构建小部件(BuildContext 上下文){
返回脚手架(
身体:中心(
child: 圆形头像(
child: Text(\”头像\”),
背景图片: AssetImage(“images/yuan.png”),
半径: 半径,
),
),
);
}
}
这里我们没有使用AnimationController来控制半径值的变化,我们通过一个Future延迟来控制。半径在初始化时为10.0,并在2 秒延迟后增加到20.0。 CircleAvatar 默认的过渡时间为200ms,因此将下次变化时间设置为210ms,以获得平滑的过渡效果。此时半径为40.0,最后在210 毫秒后半径设置为30.0,整个更改过程如下所示:
10-20-40-30
DecorationImage
主要用于BoxDecoration中的图像属性,可以说将图像显示为boxdecoration。这里不做详细解释。
小部件getBoxImage() {
返回容器(
装饰: 盒子装饰(
image: 装饰图片(image: 资产图片(“images/yuan.png”))),
);
}
这不是一个小部件,因此只能与BoxDecoration 一起使用
Ink.image
这个也很简单,用来显示图像。 这相当于如果Ink控件只有decoration.image属性,直接替换Ink的简单方法。
小部件getInkedImage() {
返回Ink.image(image: AssetImage(“images/timg.jpeg”));
}
ImageIcon
和上面的效果基本一样:
小部件getImageIcon() {
返回ImageIcon(AssetImage(\”images/timg.jpeg\”));
}
FadeInImage
放置图的渐变动画控制。该控件常在加载网络图像时使用。主要功能是在加载网络图像的耗时操作期间显示占位符图像,使用alpha动画淡出占位符图像,以及在检索网络图像时淡入网络图像。
我们来看一下渲染图
然而,这并不是灵丹妙药。如果加载单帧图像,您肯定会得到好的结果,但如果加载网络动画,如果发生网络图像错误,您同样会丢失所有帧。出现占位图片,但是直接抛出异常。我这里就不详细说了。
Image的加载过程
上面介绍了Widget层使用的一些基本的Image控件,但它们主要依赖的是ImageProvider,你可以自定义它来实现自己的加载方法。
具体流程如图所示。
uint8list 是Dart 的高效字节数组存储类。您可以使用它保存图像的二进制数据以减少转换时间。
大多数图像加载过程涉及将图像资源转换为uint8list。将uint8list处理成ui.Image的过程,不仅封装了ImageInfo,还把FrameInfo封装成了Codec。通过ImageStreamCompleter的Codec中的每一帧数据都是一个抽象类,有两个实现类:单帧解析器和多帧解析器。通常默认使用多帧解析器。
在解析后的ImageInfo中,可以通过FutureByteData toByteData({ImageByteFormat format: ImageByteFormat.rawRgba})方法更改ImageByte数据格式。
rawRgba,未解码字节,每个通道占8bitrawUnmodified,未解码和修改字节(灰度图像如PNG,这是最常见的无损数据格式)
通过在这个多帧解析器上执行一些技巧,我们可以实现控制GIF 动画的目标。
下面是我创建的用于控制GIF 加载速度的控件。
最后
多年来,编辑了解到,大多数入门级和中级Android工程师想要提高自己,往往必须自己探索和成长,这是不系统的、短暂的,我了解到这并没有帮助。
因此,我们收集整理了《2024年Android移动开发全套学习资料》册。最初的目的也很简单。换句话说,我们想帮助那些想学习、提高自己,但不知道从哪里开始的朋友。
由于文件较多,这里仅展示部分目录截图。这套完整的内容包括对领先制造商的采访、学习笔记、源代码讲义、实践项目、概述路线、电子书和教学视频。它将继续更新。
一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
如果您需要此信息,请从第 栏中获取。
9767)]
[外部链接图像正在传输.(img-xFvqkYDG-1719184819768)]
[正在传输外部链接图像.(img-enP0JyxI-1719184819769)]
[外部链接图像正在传输.(img-wTcG7vEA-1719184819769)]
由于文件较多,这里仅展示部分目录截图。这套完整的内容包括对领先制造商的采访、学习笔记、源代码讲义、实践项目、概述路线、电子书和教学视频。它将继续更新。
一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
如果您需要此信息,请从第 栏中获取。
以上介绍#Flutter图片的相关内容来源网络仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91897.html