1 图片组件Image
图片组件Image显示图像的组件,有多种构造函数:
- new Image:从ImageProvider获取图像
- new Image.asset:加载资源图片
- new Image.file:加载本地图片文件
- new Image.network:加载网络图片
- new Image.memory:加载Uint8List资源图片
常用属性:
属性名 | 类型 | 说明 |
---|---|---|
image | ImageProvider | 抽象类,需要自己实现获取图片数据的操作 |
width/height | double | Image显示区域的宽度和高度设置,这里需要把Image和图片两个区分开。图片本身有大小,Image Widget是图片的容器,本身也有大小。宽度和高度的配置经常和fitshu’x |
fit | BoxFit | 图片填充模式,具体取值见 BoxFit取值表 |
color | Color | 图片颜色 |
colorBlendMode | BlendMode | 在对图片进行手动处理的时候,可能用到图层混合,如改变图片颜色,此属性可以对颜色进行混合处理,有多种模式 |
alignment | Alignment | 控制图片的摆放位置,比如图片放置在右下角则为Alignment.bottomRight |
repeat | ImageRepeat | 此属性可以设置图片的重复模式。moRepeat为不重复,Repeat为x和y方向重复,repeatX为x方向重复,repeatY为y方向重复 |
centerSlice | Rect | 当图片需要被拉伸显示时,centerSlice定义的矩形区域会被拉伸,可以理解为我们在图片内部定义9个点用作拉伸,9个点为"上",“下”,“左”,“右”,“上中”,“下中”,“左中”,“右中”,“正中” |
matchTextDirection | bool | matchTextDirection与Derection配合使用。TextDirectio有两个值分别为:TextDirection.ltr从左到右展示图片,TextDirection.rtl为从右到左展示图片 |
gaplessPlayback | bool | 当ImageProvider发生变化后,重新加载图片的过程中,原图片的展示是否保留。值为true则保留,值为false则不保留,直接等待下一张图片加载 |
BoxFit取值及描述
取值 | 描述 |
---|---|
BoxFit.fill | 全图显示,显示可能拉伸,充满 |
BoxFit.contain | 全图显示,显示原比例,不需充满 |
BoxFit.cover | 显示可能拉伸,可能裁剪,充满 |
BoxFit.fitWidth | 显示可能拉伸,可能裁剪,宽度充满 |
BoxFit.fitHeight | 显示可能拉伸,可能裁剪,高度充满 |
BoxFit.none | 原始大小 |
BoxFit.scaleDown | 效果和BoxFit.contain差不多,但是该属性不允许显示超过原图大小(可小不可大) |
2 图片组件Image示例
在 pubspec.yaml 中添加image_picker库和图片依赖。
添加第三方图片选择库image_picker:
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
image_picker: ^0.5.0+9//第三方库
添加图片依赖(在“flutter:”下面):
assets:
- assets/images/baidu.jpg
以下代码包含了:
- 加载网络图片
- 加载Assets中的图片
- 加载Memory中的图片
- 使用image_picker从文件加载图片
import 'dart:io';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
void main() => runApp(MyApp());
//assets/images/baidu.jpg
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// debugPaintSizeEnabled = true;
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Image示例demo'),
),
body: Center(
child: Column(
children: <Widget>[
//加载网络图片
Image.network(
'https://www.baidu.com/img/bd_logo1.png?where=super',
width: 100.0,
height: 100.0,
),
//加载Assets
Image.asset(
'assets/images/baidu.jpg',
width: 200.0,
height: 200.0,
),
//Memory
MemoryImageWidget(),
//从文件加载图片
FileImageWidget(),
],
),
),
),
);
}
}
class FileImageWidget extends StatefulWidget {
@override
_FileImageWidgetState createState() => _FileImageWidgetState();
}
class _FileImageWidgetState extends State<FileImageWidget> {
File _image;
Future getImge() async {
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
_image = image;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Center(
child: _image == null
? Text('未选择图片!')
: Image.file(
_image,
width: 200.0,
height: 200.0,
),
),
FlatButton(
onPressed: getImge,
child: Text(
'选择图片',
style: TextStyle(
color: Color(0xff0000ff),
),
),
),
],
);
}
}
//stf StatefulWidget快捷键, stl StatelessWidget快捷键
class MemoryImageWidget extends StatefulWidget {
@override
_MemoryImageWidgetState createState() => _MemoryImageWidgetState();
}
class _MemoryImageWidgetState extends State<MemoryImageWidget> {
Uint8List bytes;
@override
void initState() {
super.initState();
rootBundle.load('assets/images/baidu.jpg').then((data) {
if (mounted) {
setState(() {
bytes = data.buffer.asUint8List();
});
}
});
}
@override
Widget build(BuildContext context) {
final _decoration = BoxDecoration(
image: bytes == null ? null : DecorationImage(image: MemoryImage(bytes)),
);
return Container(
width: 100.0,
height: 100.0,
decoration: _decoration,
);
}
}