Flutter 基础组件:图片和Icon
前言
Flutter中,可以通过Image组件来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。
ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvider ,如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。
Image widget有一个必选的image参数,它对应一个ImageProvider。
实例
// 图片、Icon
import 'package:flutter/material.dart';
class ImageRoute extends StatelessWidget {
@ override
Widget build(BuildContext context) {
var assetImg = AssetImage('assets/images/辣椒.png');
var networkImg = NetworkImage('https://avatars2.githubusercontent.com/u/20411648?s=460&v=4');
return SingleChildScrollView(
child: Column(
children: <Image>[
// 从assets中加载图片
Image(
image: assetImg,
width: 100.0,
),
// 从网络加载图片
Image(
image: networkImg,
width: 100.0,
),
Image(
image: networkImg,
// width、height:用于设置图片的宽、高,当不指定宽高时,图片会根据当前父容器的限制,尽可能的显示其原始大小,
// 如果只设置width、height的其中一个,那么另一个属性默认会按比例缩放,但可以通过fit属性来指定适应规则。
width: 100.0,
height: 200.0,
// 图片的混合色值
color: Colors.blue,
// 图片的混合模式
colorBlendMode: BlendMode.difference,
// 对齐方式
alignment: Alignment.center,
// 重复方式,当图片本身大小小于显示空间时,指定图片的重复规则
repeat: ImageRepeat.repeatY,
),
// 下面来讨论fit属性
Image(
image: networkImg,
height: 50.0,
width: 100.0,
// 会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。
fit: BoxFit.fill,
),
Image(
image: networkImg,
height: 50,
width: 50.0,
// 默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。
fit: BoxFit.contain,
),
Image(
image: networkImg,
width: 100.0,
height: 50.0,
// 会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。
fit: BoxFit.cover,
),
Image(
image: networkImg,
width: 100.0,
height: 50.0,
// 图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
fit: BoxFit.fitWidth,
),
Image(
image: networkImg,
width: 100.0,
height: 50.0,
// 图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
fit: BoxFit.fitHeight,
),
Image(
image: networkImg,
width: 100.0,
height: 50.0,
// 图片按比例适应。
fit: BoxFit.scaleDown,
),
Image(
image: networkImg,
height: 50.0,
width: 100.0,
// 图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。
fit: BoxFit.none,
),
].map((e){
return Row(
children: <Widget>[
Padding(
padding: EdgeInsets.all(10.0),
child: SizedBox(
width: 100,
child: e,
),
),
Text(e.fit.toString())
],
);
}).toList(),
),
);
}
}
class MyIcons{
// 微信图标
static IconData weChat = const IconData(0xe620, fontFamily: 'MyIcon', matchTextDirection: true);
// 新春图标
static IconData newYear = const IconData(0xe64a, fontFamily: 'MyIcon', matchTextDirection: true);
}
class IconRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 使用Material Design字体图标
Icon(Icons.accessible, color: Colors.green,),
Icon(Icons.error, color: Colors.green,),
Icon(Icons.fingerprint, color: Colors.green,),
// 使用自定义字体图标
Icon(MyIcons.weChat, color: Colors.green,),
Icon(MyIcons.newYear, color: Colors.green,),
],
);
}
}
注意点
- 使用自定义字体图标时,下载资源是要注意,在iconfont.cn选取图标后,加到项目中,点击“下载到本地”,注意:这里下载只能浏览器,不能用迅雷等插件。
- 下载成功后,将iconfont.ttf文件放在项目文件下,进行pubspec.yaml的配置。使用时,打开下载文件中的html页面或者在个人中心中得到图标的Unicode,但是这个Unicode不能直接用,例如得到“微信”的Unicode为“”,使用时改为“0xe620”,这时,可能IDE显示的图标对应不上,但是热重载后图标会显示成功。