Flutter基础-003-Image

477 阅读8分钟

用于图片显示的Widget,常用类别:

  • Image.asset 资源图片
  • Image.network 网络图片
  • Image.file 本地文件图片
  • Image.memory 内存图片
向项目内添加图片
  • 添加资源图片目录: 在android ios lib同目录建立一个images文件夹,将图片都放到该文件夹下 image.png
  • 配置图片信息 在pubspec.yaml中,将每个图片信息添加到文件中 image.png

注意 assets 和下面- images/xxx.jpg 的缩进,要严格按照上图所示,否则易出错。

  • Packages get下 修改完pubspec.yaml的assets后都需要重新获取下 image.png 点击Packages get 或命令行运行也可以。
  • 重新运行项目即可
Image.network 显示网络图片
Image.network("http://xxxxx.jpg",width: 50,height: 50,)

#####Image.asset 显示项目中的图片

Image.asset(String name, {
    Key key,
    AssetBundle bundle,//?
    this.semanticLabel,//?
    this.excludeFromSemantics = false,//?
    double scale,//缩放系数,图片显示宽高= 图片原图宽高/scale
    this.width,//控件宽
    this.height,//控件高
    this.color,   //单一颜色,与colorBlendMode混合模式共同作用
    this.colorBlendMode,//颜色混合模式  与color共同使用
    this.fit,//图片在父控件范围内的显示方式
    this.alignment = Alignment.center,//在范围内,图片的对齐方式
    this.repeat = ImageRepeat.noRepeat,//如果图片没有完全覆盖完控件范围,那么剩余空白范围,图片怎么处理。
    this.centerSlice,  通过rect确定图片的四个角的大小,这四个角保持不变,其余部位拉伸,直至填满整个控件
    this.matchTextDirection = false,//?
    this.gaplessPlayback = false,//?
    String package,
    this.filterQuality = FilterQuality.low,
  })
  • 图片显示 image.png
//图片保持比例,按原图大小显示,如果宽高任何一个超出了屏幕宽高,则将超出屏幕的那个宽高设定为屏幕宽高,如果都超出了,那么图片将尽可能大的在屏幕范围内按照原比例显示,也就是图片显示的宽为屏幕宽(高按比例)或高为屏幕高(宽按比例)。
//在图片可显示的尺寸内,图片居中,保持原比例显示
Image.asset("images/img03.jpg")
  • width 设置图片控件宽度
  • height 设置图片控件高度 image.png
//指定图片显示范围 width 和height
//图片保持比例显示,尽量按原图大小显示,如果宽高任何一个超出了给定宽高,则将超出给定宽高的那个宽高设定为给定宽高,,如果都超出了,那么图片将尽可能大的在给定范围内按照原比例显示,也就是图片显示的宽为给定宽(高按比例)或高为给定高(宽按比例)。
//在图片可显示的尺寸内,图片居中,保持原比例显示
Image.asset("images/img03.jpg",width: 200,height: 200,),
Divider( height: 10,color: Colors.grey,),

image.png

Image.asset("images/img03.jpg",width: 200,height: 300,),
Divider(height: 10,color: Colors.grey,),

image.png

Image.asset("images/img03.jpg",width: 600,height: 200,),
Divider(height: 10,color: Colors.grey,),
  • Image的width 和height受容器大小限制,如果超出了容器大小,按容器大小计算 image.png
Container(width: 200,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03.jpg",width: 300,height: 300,),
            ),
Divider(height: 10,color: Colors.grey,),
alignment 属性 在容器内的显示位置,默认Alignment.center 中间,取值包括:

Alignment.topLeft 顶部靠左 Alignment.topCenter 顶部中间 Alignment.topRight 顶部靠右 Alignment.centerLeft 中间靠左 Alignment.center 中间
Alignment.centerRight 中间靠右 Alignment.bottomLeft 底部靠左 Alignment.bottomCenter 底部中间 Alignment.bottomRight 底部靠右 Alignment.lerp(Alignment.topLeft, Alignment.topRight, t) 线性取值,t在0-1之间,t越小越倾向于左侧的值,t越大越倾向于右边的值 image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,),
            ),

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.topLeft,),
            ),

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.topCenter,),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.topRight,),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.centerLeft,),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.center,),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.centerRight,),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.bottomLeft,),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.bottomCenter,),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.bottomRight,),
            )
  • Alignment.lerp(Alignment a, Alignment b, t) image.png
Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.lerp(Alignment.topLeft, Alignment.topRight, 0.1),),
            ),
Divider(height: 10,color: Colors.grey,),
Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.lerp(Alignment.topLeft, Alignment.topRight, 0.3),),
            ),
Divider(height: 10,color: Colors.grey,),
Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.lerp(Alignment.topLeft, Alignment.topRight, 0.5),),
            )

image.png

Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.lerp(Alignment.topLeft, Alignment.topRight, 0.7),),
            ),
Divider(height: 10,color: Colors.grey,),
Container(width: 300,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 300,height: 200,alignment: Alignment.lerp(Alignment.topLeft, Alignment.topRight, 0.9),),
            )
fit属性,图片在控件范围内的显示方式

BoxFit.none,如果图片尺寸小于控件范围,则居中显示,否则以控件大小截取原图中间位置范围的图片显示, BoxFit.contain 大图缩小 小图放大,保持比例,使图片的宽或高与控件宽或高一致 BoxFit.cover 保持原图比例,大图缩小,小图放大,直至把整个控件填满,图片的宽或高至少有一个与图片的宽或高一致,另一边裁剪 BoxFit.fill 不考虑原图比例,图片的宽放大或缩小到控件宽,并且图片高放大或缩小到控件高,填充满控件 BoxFit.fitHeight 图片高放大或缩小至控件高,宽等比放大或缩小 BoxFit.fitWidth 图片宽放大或缩小至控件高,高等比放大或缩小 BoxFit.scaleDown 如果图片尺寸大于控件范围,就缩放图片直至能显示完全图片,也就是宽或高中的一个与控件宽高一致。图片尺寸小于控件,则不处理,居中显示

说明:图片img03尺寸大于控件范围,图片img03_small尺寸小于控件范围 image.png

//不设置fit   小图居中显示
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,),
            ),
// 设置BoxFit.none   小图居中显示
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,fit: BoxFit.none,),
            ),

image.png

//不设置fit   大图尽可能大的在控件内按原比例显示
Divider(height: 10,color: Colors.grey,),
            Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03.jpg",width: 200,height: 200,),
            ),
//设置BoxFit.none  使用控件大小在原图中间位置裁剪图片显示
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03.jpg",width: 200,height: 200,fit: BoxFit.none,),
            ),

image.png

//小图宽度放大至控件宽
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,fit: BoxFit.contain,),
            ),
// 大图宽度缩小至控件宽,图片比例不变
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03.jpg",width: 200,height: 200,fit: BoxFit.contain,),
            ),

image.png

//小图放大,直至填充满控件,至少宽或高中的一个与控件的宽高一致,另一个变裁剪
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,fit: BoxFit.cover,),
            ),
//大图缩小,直至填充满控件,至少宽或高中的一个与控件的宽高一致,另一个变裁剪
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03.jpg",width: 200,height: 200,fit: BoxFit.cover,),
            ),

image.png

//小图放大  宽放大至控件宽  高放大至控件高  不考虑原图比例
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,fit: BoxFit.fill,),
            ),
//大图缩小  宽缩小至控件宽  高缩小至控件高  不考虑原图比例
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03.jpg",width: 200,height: 200,fit: BoxFit.fill,),
            ),

image.png

Divider(height: 10,color: Colors.grey,),
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,fit: BoxFit.fitHeight,),
            ),
Divider(height: 10,color: Colors.grey,),
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,fit: BoxFit.fitWidth,),
            ),

image.png

//小图不变,居中显示
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,fit: BoxFit.scaleDown,),
            ),
//大图缩小,直至能显示完全图片
Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03.jpg",width: 200,height: 200,fit: BoxFit.scaleDown,),
            ),
repeat 如果图片没有完全覆盖完控件范围,那么剩余空白范围,图片怎么处理。

ImageRepeat.noRepeat 不处理 ImageRepeat.repeat xy轴重复显示 ImageRepeat.repeatX x轴重复显示 y轴不变 ImageRepeat.repeatY y轴重复显示 x轴不变

image.png

Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_min.jpg",width: 200,height: 200,repeat: ImageRepeat.repeat,),
            )

image.png

Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_min.jpg",width: 200,height: 200,repeat: ImageRepeat.repeatX,),
            )

image.png

Container(width: 300,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_min.jpg",width: 200,height: 200,repeat: ImageRepeat.repeatY,),
            )
centerSlice

Rect.fromLTRB(70, 70, 140, 140) 确定四个角的大小,这四个角不拉伸,其余位置拉伸,直至填满控件 image.png

Container(width: 400,height: 300,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200,centerSlice:Rect.fromLTRB(70, 70, 140, 140) ,),
            ),
scale

image.png

Divider(height: 10,color: Colors.grey,),
Container(width: 200,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200 ,scale: 1.5,),
            ),
Divider(height: 10,color: Colors.grey,),
Container(width: 200,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200 ,scale: 2,),
            ),
Divider(height: 10,color: Colors.grey,),
Container(width: 200,height: 200,color: Colors.orange[200],
              child: Image.asset("images/img03_small.jpg",width: 200,height: 200 ,scale: 3,),
            ),