Flutter Widgets: Image

标签: Flutter  Image  Widget

介绍

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 这里写图片描述
版权声明:本文为poorkick原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/poorkick/article/details/80458707

智能推荐

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...