Flutter中的Image入门讲解,flutter enum

Flutter中的Image入门讲解看一段简单的代码
class _MyHomePageState extends State { ImageInfo info;//图片信息 List blendModes BlendMode.valu

我们看一下简单的代码

类_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

(0)
CSDN's avatarCSDN
上一篇 2024年6月24日 上午7:20
下一篇 2024年6月24日 上午7:56

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注