【Flutter 组件】004-基础组件:图片及 ICON

2023-10-26

【Flutter 组件】004-基础组件:图片及 ICON

一、图片

1、Image

概述

Flutter 中,我们可以通过 Image 组件来加载并显示图片,Image 的数据源可以是 asset 、文件、内存以及网络

Image 是一个用于展示图片的组件。支持 JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP、BMP 和 WBMP 等格式。

Image 的几个构造方法

方法 释义
Image() ImageProvider中获取图片,从本质上看,下面的几个方法都是他的具体实现。
Image.asset(String name) AssetBundler中获取图片
Image.network(String src) 显示网络图片
Image.file(File file) File中获取图片
Image.memory(Uint8List bytes) Uint8List中显示图片

常用属性

1.alignment → AlignmentGeometry - 图像边界内对齐图像。
2.centerSlice → Rect - 九片图像的中心切片
3.color → Color - 该颜色与每个图像像素混合 colorBlendMode。
4.colorBlendMode → BlendMode - 用于 color 与此图像结合使用。
5.fit → BoxFit - 图像在布局中分配的空间。
6.gaplessPlayback → bool - 当图像提供者发生变化时,是继续显示旧图像(true)还是暂时不显示(false)。
7.image → ImageProvider - 要显示的图像。
8.matchTextDirection → bool - 是否在图像的方向上绘制图像 TextDirection。
9.repeat → ImageRepeat - 未充分容器时,是否重复图片。
10.height → double - 图像的高度。
11.width → double - 图像的宽度。

ImageProvider

ImageProvider 是一个抽象类,主要定义了图片数据获取的接口 load() ,从不同的数据源获取图片需要实现不同的 ImageProvider ,如 AssetImage 是实现了从 Asset 中加载图片的 ImageProvider,而 NetworkImage 实现了从网络加载图片的 ImageProvider。

ImageProvider 的实现类:

2、从 asset 中加载图片

第一步:准备图片

第二步:使用图片

import 'package:flutter/material.dart';

void main() {runApp(MaterialApp(home: Scaffold(appBar: AppBar(title: const Text("訾博的学习笔记")),body: const MyApp(),),));
}

class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Center(child: Container(alignment: Alignment.center,height: 200,width: 200,child: Center(child: Image(image: AssetImage('assets/images/zibo-logo.jpg')),),),);}
} 

第三步:运行结果

不同的 fit 方式代码示例

 Row _localRow(){return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [Container(width: 30,height: 60,color: Colors.yellow,child: Image.asset('images/base_widgets/star_black.png', fit: BoxFit.none,),),Container(width: 30,height: 60,color: Colors.yellow,child: Image(image: AssetImage('images/base_widgets/star_black.png'),fit: BoxFit.fill,),),Container(width: 30,height: 60,color: Colors.yellow,child: Image(image: AssetImage('images/base_widgets/star_black.png'),fit: BoxFit.cover,),),Container(width: 30,height: 60,color: Colors.yellow,child: Image(image: AssetImage('images/base_widgets/star_black.png'),fit: BoxFit.contain,),),Container(width: 30,height: 60,color: Colors.yellow,child: Image(image: AssetImage('images/base_widgets/star_black.png'),fit: BoxFit.fitHeight,),),Container(width: 30,height: 60,color: Colors.yellow,child: Image(image: AssetImage('images/base_widgets/star_black.png'),fit: BoxFit.fitWidth,),),Container(width: 30,height: 60,color: Colors.yellow,child: Image(image: AssetImage('images/base_widgets/star_black.png'),fit: BoxFit.scaleDown,),),],); 

3、从网络加载图片

第一步:准备一个网络图片地址

https://himg.bdimg.com/sys/portraitn/item/public.1.a535a65d.tJe8MgWmP8zJ456B73Kzfg 

第二步:使用图片

import 'package:flutter/material.dart';

void main() {runApp(MaterialApp(home: Scaffold(appBar: AppBar(title: const Text("訾博的学习笔记")),body: const MyApp(),),));
}

class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Center(child: Container(alignment: Alignment.center,height: 200,width: 200,child: Center(child: Image(image: NetworkImage('https://himg.bdimg.com/sys/portraitn/item/public.1.a535a65d.tJe8MgWmP8zJ456B73Kzfg')),),),);}
} 

第三步:运行结果

带占位图片的网络图片代码示例

 ListView _listview(){return ListView(padding: const EdgeInsets.all(30),children: [Text("本地图片"),Container(height: 150,child: _localRow(),),Text("网络图片"),Image.network('http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg'),Text("带占位图的网络图片,成功加载"),FadeInImage.assetNetwork(placeholder: 'images/base_widgets/star_black.png',image: 'http://tiebapic.baidu.com/forum/w%3D580/sign=a96ca741eafaaf5184e381b7bc5594ed/7ea6a61ea8d3fd1f2643ad5d274e251f95ca5f38.jpg',fit: BoxFit.fill,),],);} 

4、Image 缓存

Flutter 框架对加载过的图片是有缓存的(内存),关于 Image 的详细内容及原理我们将会在后面进阶部分深入介绍。

二、ICON

1、概述

Flutter 中,可以像Web开发一样使用 iconfont,iconfont 即“字体图标”,它是将图标做成字体文件,然后通过指定不同的字符而显示不同的图片。

在字体文件中,每一个字符都对应一个位码,而每一个位码对应一个显示字形,不同的字体就是指字形不同,即字符对应的字形是不同的。而在iconfont中,只是将位码对应的字形做成了图标,所以不同的字符最终就会渲染成不同的图标。

2、与图片相比的优势

在Flutter开发中,iconfont和图片相比有如下优势:

1.体积小:可以减小安装包大小。
2.矢量的:iconfont都是矢量图标,放大不会影响其清晰度。
3.可以应用文本样式:可以像文本一样改变字体图标的颜色、大小对齐等。
4.可以通过TextSpan和文本混用。

3、使用 Material Design 字体图标

Flutter 默认包含了一套 Material Design 的字体图标,在 pubspec.yaml 文件中的配置如下

flutter:uses-material-design: true 

Material Design 所有图标可以在其官网查看:material.io/tools/icons…

我们看一个简单的例子:

String icons = "";
// accessible: 0xe03e
icons += "\uE03e";
// error:0xe237
icons += " \uE237";
// fingerprint: 0xe287
icons += " \uE287";

Text(icons,style: TextStyle(fontFamily: "MaterialIcons",fontSize: 24.0,color: Colors.green,),
); 

运行效果如图3-15所示:

通过这个示例可以看到,使用图标就像使用文本一样,但是这种方式需要我们提供每个图标的码点,这并对开发者不友好,所以,Flutter封装了 IconDataIcon专门显示字体图标,上面的例子也可以用如下方式实现:

Row(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Icon(Icons.accessible,color: Colors.green),Icon(Icons.error,color: Colors.green),Icon(Icons.fingerprint,color: Colors.green),],
) 

Icons 类中包含了所有 Material Design 图标的 IconData 静态变量定义。

4、使用自定义字体图标

我们也可以使用自定义字体图标。iconfont.cn上有很多字体图标素材,我们可以选择自己需要的图标打包下载后,会生成一些不同格式的字体文件,在Flutter中,我们使用ttf格式即可。

假设我们项目中需要使用一个书籍图标和微信图标,我们打包下载后导入:

第一步:导入字体图标文件

导入字体图标文件;这一步和导入字体文件相同,假设我们的字体图标文件保存在项目根目录下,路径为"fonts/iconfont.ttf":

fonts:- family: myIcon#指定一个字体名fonts:- asset: fonts/iconfont.ttf 

第二步:定义一个MyIcons

class MyIcons{// book 图标static const IconData book = const IconData(0xe614, fontFamily: 'myIcon', matchTextDirection: true);// 微信图标static const IconData wechat = const IconData(0xec7d,fontFamily: 'myIcon', matchTextDirection: true);
} 

第三步:使用

Row(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Icon(MyIcons.book,color: Colors.purple),Icon(MyIcons.wechat,color: Colors.green),],
) 

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Flutter 组件】004-基础组件:图片及 ICON 的相关文章

  • 更改首选项的背景颜色

    我有一个PreferenceCategory xml 文件 我已经在其中定义了所有首选项 我从扩展的类中调用它PreferenceActivity 我无法设置设置屏幕的背景 该屏幕是在如下所示的 xml 文件的帮助下显示的 请看我已经定义了
  • 如何使用 Android 版 Facebook 同步的联系人图片

    我的手机上安装了 Android 版 Facebook 它会自动将联系人列表中人员的 FB 个人资料图片同步到我的手机 我想在我访问的应用程序中使用这些图片ContactsContract PhoneLookup 我真的需要 Faceboo
  • 更改操作栏标题文本颜色

    我正在尝试更改 ActionBar 中标题文本的颜色 但我似乎无法让它工作 这是我尝试使用的风格 在我的应用程序主题中我使用titleTextStyle
  • 服务在后台运行?

    我正在构建的应用程序的功能之一是记录功能 我通过在服务中启动 MediaRecorder 对象来实现此目的 Intent intent new Intent v getContext RecordService class Messenge
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • 不使用 CookieManager 的 Android 会话 cookie

    我的应用程序进行多次网络调用以获得身份验证 我需要将此会话存储在 cookie 中 我想使用 Cookie Manager 但经过一些研究后 我发现它仅适用于 API 9 及更高版本 并且我的应用程序需要向后兼容 我使用 HTTPURLCo
  • 将寻呼机视为列表视图行项目

    我有一个包含 20 行的列表视图 我想为列表视图中的每一行设置一个视图寻呼机 由于列表视图的行中的项目可能是一个或多个 并且我想使用视图分页器显示列表视图行项目 为此 我使用以下代码 将显示在列表视图行中的自定义布局 作为分页器项目
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • Android接收通知打开和取消事件

    我从 webService 接收数据以生成自定义通知 我想追踪Intent要知道open 点击 或cancel 滑动 通知上的事件 以报告服务器进行分析 有没有听众onIntentStart or onIntentCanceled 也许是通
  • NoClassDefFoundError:com.google.firebase.FirebaseOptions

    我继续得到NoClassDefFoundError在我正在使用的其他测试设备 4 4 2 上 但在我的测试设备 Android 5 1 上运行良好 我尝试了用谷歌搜索的解决方案 但似乎没有任何效果 我正在使用 Firebase 实时数据库
  • 改造Android基本且简单的问题

    我的服务器返回简单的 Json 结果 如下所示 message Upload Success 我正在尝试将结果放入改造模型类中 public class MyResponse SerializedName message String me
  • Android apk 调试模式工作正常,但发布模式给出太多警告

    我正在尝试从 eclipse 获取签名的 APK 我有一个可调试的 apk 版本 运行良好 现在发布时 当我尝试使用 Eclipse ADT 进行编译和签名时 我收到很多警告 其中大部分是can t find superclass or i
  • 找不到资源矢量绘图的异常

    我将在某些设备上运行我的应用程序 其崩溃日志如下 01 04 16 54 02 206 7466 7466 com lawnmowers E AndroidRuntime FATAL EXCEPTION main Process com l
  • 如何在颤动中添加行之间的空间?

    主要问题是我想在行之间添加一些空格 并且该行是SingleChildScrollView 我的小部件树 child SingleChildScrollView child Column mainAxisAlignment MainAxisA
  • Exif 方向标签返回 0

    我正在开发一个自定义相机应用程序 我面临以下问题 当我尝试使用检索方向时ExifInterface 它总是返回 0 ORIENTATION UNDEFINED 这使我无法将图像旋转到正确的状态 从而无法正确显示 我使用示例代码来设置相机旋转
  • 如何用 XML 制作双渐变(类似 iphone)

    如何使用 XML 制作这种可绘制渐变 我可以做一个从颜色 A 到颜色 B 的简单渐变 但我不知道如何在同一个可绘制对象中组合两个渐变 我终于找到了一个带有图层列表的解决方案 这对我来说已经足够好了
  • Flutter/Dart:将十六进制颜色字符串转换为颜色?

    我们的数据库将颜色保存为String就像 AABBCC 所以我基本上正在寻找这样的函数 Color parseColor AABBCC 对于颤振 Color 类需要这样的东西Color 0xFF42A5F5 所以我需要转换 AABBCC t
  • TYPE_ACCELEROMETER 和 TYPE_LINEAR_ACCELERATION 传感器有什么区别?

    I think TYPE ACCELEROMETER显示设备加速 但是 我不明白什么时候应该使用TYPE LINEAR ACCELERATION 我需要计算移动设备的速度 哪种传感器适合此应用 另外 我读到TYPE LINEAR ACCEL
  • 将 firebase 消息传递添加到 flutter android 项目时出现依赖错误

    我已将 firebase 消息传递添加到我的 Flutter 项目中 在 iOS 上运行良好 在 Android 上运行时出现错误 Android dependency androidx localbroadcastmanager loca

随机推荐

  • 5、若依服务监控

    文章目录 一 基本介绍 二 如何使用 1 添加依赖 2 在 application yml 配置暴露所有监控端点 3 监控启动类 4 启动后访问 http localhost 9100 actuator 返回正确数据表示测试通过 三 端点分
  • vue给标签动态添加元素_动态添加dom元素,并绑定vue事件

    背景 后管系统配置一个产品后 前端 vue js框架 取到这些产品信息并展示出来 产品经理要求在文本内容中添加链接 例如 本保险不承保前往处于战争状态或已被宣布为紧急状态的国家或地区 最新信息以登陆http baoxian pingan c
  • 随手记3:C#Unity中随机数的使用

    问题 在同时引用UnityEngine和System命名空间时 using UnityEngine 继承MonoBehaviour类 using System 用到了浮点数转字符串的Convert函数 如果直接Random Range fl
  • 安装mysql

    wget http repo mysql com mysgl community release el7 5 noarch rpm rpm ivh mysgl community release el7 5 noarch rpm yum y
  • JDBC简介(2)

    前篇 JDBC简介 1 1 Connection角色 Connection表示与特定数据库的连接 可以获取到数据库的一些信息 这些信息包括 其表信息 应该支持的SQL语法 数据库内有什么存储过程 此链接功能的信息等等 在一般实际使用情况下
  • Srpingboot项目application.yml文件没有生效

    1 首先看文件头是不是树叶 如果是不是 文件名称可能存在问题 我的问题 因为有父工程 去掉子工程里面的
  • 第11章 分布式事务解决方案

    mini商城第11章 分布式事务解决方案 一 课题 分布式事务解决方案 二 回顾 1 MongoDB部署及应用 2 购物车功能实现 3 订单功能实现 三 目标 1 分布式事务 事务简介 本地事务讲解 不同场景下的分布式事务 2 分布式事务理
  • C++开发过程笔记~~持续更新~~

    文章目录 1 为什么只有 析构函数不论基类和派生类都用到了virtual关键字 2 c inline使函数实现可以在头文件中 避免多重定义错误 3 this gt 4 调用另一个cpp文件中函数 多个 cpp文件编译 5 有空看看开源项目g
  • 老猿学5G:融合计费场景的离线计费会话的Nchf_OfflineOnlyCharging_Update 更新操作过程

    前往老猿Python博文目录 一 Nchf OfflineOnlyCharging Update消息交互过程 Nchf OfflineOnlyCharging Update消息是是5G融合计费的离线计费中CHF为SMF中的NF功能体CTF提
  • 用css 添加手状样式,鼠标移上去变小手,变小手

    用css 添加手状样式 鼠标移上去变小手 变小手 cursor pointer 用JS使鼠标变小手onmouseover 鼠标越过的时候 nm use ver this style cursor hand cursor其他取值 auto 标
  • OpenGL学习笔记(六)-模型加载

    参考网址 LearnOpenGL 中文版 哔哩哔哩教程 第三章 模型加载 3 1 Assimp 1 Assimp能够导入多种模型文件格式 将所有的模型数据加载至Assimp的通用数据结构中 我们就能够从Assimp的数据结构中提取我们所需的
  • linux操作系统下根目录下各目录的作用

    bin 二进制文件 普通用户和超级用户使用的命令 sbin 二进制文件 root用户也就是管理员使用的命令 普通用户没有权限 boot 系统启动的关键文件 dev 管理各个设备的文件 etc 所有程序的配置文件 home 用户家目录文件 l
  • 消息循环中的TranslateMessage函数和DispatchMessage函数

    TranslateMessage函数 函数功能描述 将虚拟键消息转换为字符消息 字符消息被送到调用线程的消息队列中 在下一次线程调用函数GetMessage或PeekMessage时被读出 函数原型 BOOL TranslateMessag
  • javanio应用场景,从理论到实践!

    直击面试 反正我是带着这些问题往下读的 说一下 JVM 运行时数据区吧 都有哪些区 分别是干什么的 Java 8 的内存分代改进 举例栈溢出的情况 调整栈大小 就能保存不出现溢出吗 分配的栈内存越大越好吗 垃圾回收是否会涉及到虚拟机栈 方法
  • moviepy音视频剪辑:颜色相关变换函数blackwhite、colorx、fadein/out、gamma_corr、invert_colors、lum_contrast、mask_color详解

    前往老猿Python博文目录 注意 本文为收费专栏文章 对应免费专栏文章为 moviepy音视频剪辑 颜色相关变换函数blackwhite colorx fadein out gamma corr invert colors lum con
  • Java 匿名对象

    一 简介 1 1 含义 没有名字的对象 以常规的创建对象的方法 AtomicInteger atomicInteger new AtomicInteger 100000 格式 类名 变量名 new 类名 这样就完成了对象的创建 注意 内可以
  • windows系统启动服务一直不成功,查看windows日志方法

    今天遇到一个问题 windows系统部署了spring cloud的服务 手动执行start bat文件可以启动服务 用服务的方式启动就一直启动不了 通过 控制面板 gt 管理工具 在 事件查看器 gt windows日志 gt 应用程序
  • 遮罩和蒙版有什么区别,视频遮罩怎么用

    在制作短视频时 好多小伙伴分不清遮罩与蒙版的区别 甚至有的人认为它们就是一个东西 要说起来 这两个看似一样的概念 其实还是有很大的区别 今天就来带各位了解一下遮罩和蒙版有什么区别 视频遮罩怎么用 希望对各位认识并理解蒙版和遮罩有一定的帮助
  • 根据java实体类生成创建表sql步骤

    根据java实体类生成创建表sql步骤 根据java实体类生成创建表sql语句时 方法是利用java反射 AOP注解 主要步骤如下 1 注解类 一般在生成表的时候 需要表名 主键名 字段名 对应到注解上至少要体现出这三部分 1 1表名 主键
  • 【Flutter 组件】004-基础组件:图片及 ICON

    Flutter 组件 004 基础组件 图片及 ICON 一 图片 1 Image 概述 Flutter 中 我们可以通过 Image 组件来加载并显示图片 Image 的数据源可以是 asset 文件 内存以及网络 Image 是一个用于