Flutter Widgets: Image
介绍
Image, 图片显示Widget, 和Android ImageView相似,但是从实际使用的方法上看,与常用的图片加载库,如Picasso,Glide等相似,支持本地图片,资源图片,网络图片等加载方式。
类结构
构造方法
| 方式 | 解释 |
|---|---|
| Image() | 通用方法,使用ImageProvider实现,如下方法本质上也是使用的这个方法 |
| Image.asset | 加载资源图片 |
| Image.file | 加载本地图片文件 |
| Image.network | 加载网络图片 |
| Image.memory | 加载Uint8List资源图片 |
属性值
image
ImageProvider, 抽象类,需要自己实现获取图片数据的操作。如下是常用的一些ImageProvider,当然自定义自己的ImageProvider也是OK的,实现方法,可以参考下面表中这些已经成熟使用的例子。
| ImageProvider |
|---|
| ExactAssetImage |
| AssetImage |
| NetworkImage |
| FileImage |
| MemoryImage |
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(title: new Text("Container Test"),
centerTitle: true,),
body: new ListView(
children: <Widget>[
// 资源图片
new Image.asset('imgs/logo.jpeg'),
//网络图片
new Image.network(
'https://flutter.io/images/homepage/header-illustration.png'),
// 本地文件图片
new Image.file(new File("/Users/gs/Downloads/1.jpeg")),
// Uint8List图片
new Image.memory(bytes),
//使用ImageProvider加载图片
new Image(image: new NetworkImage(
"https://flutter.io/images/homepage/screenshot-2.png"),)
],
),
);
}
width & height
Image显示区域的宽度和高度设置,这里需要把Image和图片两个东西区分开,图片本身有大小,Image Widget本身也是有大小的,Image Widget是图片的容器。宽度和高度的配置经常和下面的fit属性配合使用。
@override
Widget build(BuildContext context) {
// TODO: implement build
Image image = new Image.asset(
'imgs/logo.jpeg',
width: 200.0,
height: 100.0,
fit: BoxFit.fill,
);
return new Scaffold(
appBar: new AppBar(title: new Text("Image Test"),
centerTitle: true,),
body: image,
);
}
设置宽度高度,然后设置图片充满Image,因为我们的源图片是1:1的大小,所以这里拉伸或者挤压是正常。
fit
| fit | Description | Result |
|---|---|---|
| BoxFit.fill | 全图显示,显示可能拉伸,充满 | ![]() |
| BoxFit.contain | 全图显示,显示原比例,不需充满 | ![]() |
| BoxFit.cover | 显示可能拉伸,可能裁剪,充满 | ![]() |
| BoxFit.fitWidth | 显示可能拉伸,可能裁剪,宽度充满 | ![]() |
| BoxFit.fitHeight | 显示可能拉伸,可能裁剪,高度充满 | ![]() |
| BoxFit.none | ||
| BoxFit.scaleDown | 效果和contain差不多,但是此属性不允许显示超过源图片大小,可小不可大 | ![]() |
color & colorBlendMode
color和colorBlendMode一般配合使用,BlendMode, 为混合模式的意思,包含如下诸多模式。感觉和Android中Xfermode是一个原理。
随意看几个效果吧。
BlendMode.colorBurn
Image image = new Image.asset(
'imgs/logo.jpeg',
width: 400.0,
height: 500.0,
fit: BoxFit.scaleDown,
color: Colors.greenAccent,
colorBlendMode: BlendMode.colorBurn,
);
BlendMode.exclusion
BlendMode.colorDodge
alignment
控制图片的摆放位置。如下将图片放置在右下角。其他的位置自行尝试。
alignment: Alignment.bottomRight,
repeat
一图胜前言
Image image = new Image.asset(
'imgs/logo.jpeg',
width: 400.0,
height: 500.0,
fit: BoxFit.scaleDown,
repeat: ImageRepeat.repeat,
);
| repeat | Results |
|---|---|
| ImageRepeat.repeat | |
| ImageRepeat.repeatX | |
| ImageRepeat.repeatY | |
| ImageRepeat.none |
centerSlice
当图片需要被拉伸显示的时候,centerSlice定义的矩形区域会被拉伸,可以理解成我们在图片内部定义来一个点9文件用作拉伸。
Image image = new Image.asset(
'imgs/logo.jpeg',
width: 500.0,
height: 500.0,
fit: BoxFit.contain,
centerSlice: new Rect.fromCircle(center: const Offset(100.0, 100.0), radius: 10.0 ),
);
注意一下这部分,代码中有如是一段:
assert(sourceSize == inputSize, 'centerSlice was used with a BoxFit that does not guarantee that the image is fully visible.');
也就是说只有在显示大小大于原图大小的情况下,才允许使用这个属性,否则会报错。
matchTextDirection
与Directionality配合使用
@override
Widget build(BuildContext context) {
// TODO: implement build
Image image = new Image.asset(
'imgs/android.jpg',
fit: BoxFit.scaleDown,
matchTextDirection: true,
);
return new Scaffold(
appBar: new AppBar(title: new Text("Image Test"),
centerTitle: true,),
body: new ListView(
children: <Widget>[
new Directionality(
textDirection: TextDirection.ltr,
child: image,
),
new Directionality(
textDirection: TextDirection.rtl,
child: image,
),
],
)
);
}
列表中两个图片,第一个是TextDirection.ltr,第二个TextDirection.rtl。
gaplessPlayback
当ImageProvider发生变化后,重新加载图片的过程中,原图片的展示是否保留。若值为true,保留,若为false,不保留,直接空白等待下一张图片加载。
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
NetworkImage networkImage = new NetworkImage("https://flutter.io/images/homepage/header-illustration.png");
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(title: new Text("Image Test"),
centerTitle: true,),
body: new ListView(
children: <Widget>[
new Directionality(
textDirection: TextDirection.ltr,
child: new Image(image: widget.networkImage, fit: BoxFit.contain,gaplessPlayback: true,),
),
new InkWell(
child: new Text("点击我切换图片", textAlign: TextAlign.center,),
onTap: (){
setState(() {
print("change pic");
widget.networkImage = new NetworkImage("https://flutter.io/images/intellij/hot-reload.gif");
});
},)
],
)
);
}
}
| gaplessPlayback | Result |
|---|---|
| true | |
| false |
智能推荐
Flutter Widgets 之 PageView
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 基础用法 PageView控件可以实现一个“图片轮播”的效果,PageView不仅可以水平滑动也可以垂直滑动,简单用法如下: PageView滚动方向默认是水平,可以设置其为垂直方向: PageView配合PageController...
Flutter Widgets 之 Wrap
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Wrap可以为子控件进行水平或者垂直方向布局,且当空间用完时,Wrap会自动换行,也是常说的流式布局。 创建多个子控件做为Wrap的子控件,代码如下: 效果如图: 布局方向 direction属性控制布局方向,默认为水平方向,设置方向为垂直代码如下: 效果...
Flutter Widgets 之 SafeArea
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 现如今的手机已经不能提供给应用程序规整的矩形界面了,一些带圆角或者是刘海屏让应用程序的布局更加复杂,甚至是需要单独适配,这对开发者来来太糟糕了。 因此SafeArea控件应用而生,SafeArea通过MediaQuery检测屏幕的尺寸使应用程序的大小与屏幕适...
Flutter布局类 - Widgets
线性布局Row和Column 在线性布局中,有两个定义对齐方式的枚举类MainAxisAlignment和CrossAxisAlignment,分别代表主轴对齐和纵轴对齐。 Row:Row可以在水平方向排列其子widget Column:Column可以在垂直方向排列其子widget 特殊情况: 如果Row里面嵌套Row,或者Column里面再嵌套Column,那么只有对最外面的Row或Colum...
Flutter Widgets 之 Opacity和AnimatedOpacity
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Flutter中移除一个控件非常容易,只需要在重新创建中移除即可,如果想要移除控件同时它的位置依然保留,类似于Android中View的invisible,比如Row中有3个颜色块,分别为1、2、3,代码如下: 效果如下: 这时想要移除2,同时还保留2的位置...
猜你喜欢
冒泡排序,及改进方式,性能优化400%>>>附图解加源码
首先源码附上,源码中带有注释,看不懂没关系,源码后面附带图解,最后附上代码效率提升图 源码如下: 方案一:其实实现很简单,两层循环,每次内层迭代出最大的一个值,将其放入数组最后一个位置,外层循环的末端便往前移一位。其原理如下图 方案一代码块: 方案二:优化改进 仔细观察上面的图,我们不难发现当迭代到图下这样的情况时,其实已经全排序好了,但是我们还是需要对它进行1,2,3,4,5,6的迭代,这些情况...
css3常用选择器
先介绍一下基本选择器,如下几种 *:通配符。选择页面的所有元素 E:元素选择器。对页面的一些元素进行选择,如p,div,li等 .class:类选择器 #id:id选择器。一个Id在一个页面中只能选择,这是和类选择器的区别 E F:后代选择器。如ul li。选中ul下的li E>F:子元素选择器。如下,可以用 h1 > strong {color:red;}使h1的子元素strong变...
python is not set from command line or npm configuration
问题 猜测原因 python版本冲突 解决方案 去官网找到最新版本python 点击下载,注意记住你下载的目录,下载好以后,打开这个目录下的文件夹,Python310, 整个文件夹复制一下 在项目里运行npm config list --json 找到python的路径 我的是 C:\\Python27\\python.exe 说明项目里用的还是py...
Java8 Stream流操作
前言 我们常常需要将一个容器转化成另一个容器,或是对这个容器中的数据进行批量处理,这时使用Stream流可以大大减少我们的工作量。 1 Stream概述 Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。 那么什么是Stream? Stream将要处理的元素集合看作一种流,在流的过程中,借助St...
带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑
在Windows下进行C++的开发,不可避免的要与Windows的底层库进行交互,然而VS下的一项设置MT、MTd、MD和MDd却经常让人搞迷糊,相信不少人都被他坑过,特别是你工程使用了很多第三库的时候,及容易出现各种链接问题。看一下下面这个错误提示: LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined...






