Flutter学习】基本组件之图片组件Image

一,概述
  Image(图片组件)是显示图像的组件,一个显示图片的widget,支持图像格式:JPEG,PNG,GIF,动画GIF,WebP,动画WebP,BMP和WBMP。 Image组件有多种构造函数:

  • new Image: 从ImageProvider获取图像。
  • new Image.asset: 加载本地图片文件。
  • new Image.file: 加载本地图片文件。
  • new Image.network: 加载网络图片。
  • new Image.memory: 加载Uint8List资源图片。

二,继承关系

  • Object > Diagnosticablet > DiagnosticableTreet > Widgett > StatefulWidgett > Image

三,构造方法

  • new Image: 从ImageProvider获取图像。
    • 类名构造方法,它指定了图片是从哪里加载,是从项目中还是网络中等等。  
      const Image({ Key key, @required this.image, this.frameBuilder, this.loadingBuilder, this.semanticLabel, this.excludeFromSemantics = false, this.width, this.height, this.color, this.colorBlendMode, this.fit, this.alignment = Alignment.center, this.repeat = ImageRepeat.noRepeat, this.centerSlice, this.matchTextDirection = false, this.gaplessPlayback = false, this.filterQuality = FilterQuality.low, }) : assert(image != null), assert(alignment != null), assert(repeat != null), assert(filterQuality != null), assert(matchTextDirection != null), super(key: key);
  • new Image.asset: 加载资源图片文件。
    • 命名构造方法,用于使用key从AssetBundle获取图像。就是加载项目资源目录中的图片,加入图片后会增大打包的包体体积,用的是相对路径。
    • 其实就相当于第一种构造方法指定 ImageProvider 为 AssetImage
    • 沿袭的是 iOS 的图片风格,分为 1x,2x,3x,具体做法是在项目的根目录下创建两个文件夹,如下图所示:

    • 然后需要在 pubspec.yaml文件中声明一下:

      flutter:
      
        # The following line ensures that the Material Icons font is
        # included with your application, so that you can use the icons in
        # the material Icons class.
        uses-material-design: true
        assets:
          - images/logo.png
          - images/2.0x/logo.png
          - images/3.0x/logo.png
    • 用法如下:

      new Image.asset('images/logo.png')
    • 构造方法
    •   Image.asset(
          String name, {
          Key key,
          AssetBundle bundle,
          this.frameBuilder,
          this.semanticLabel,
          this.excludeFromSemantics = false,
          double scale,
          this.width,
          this.height,
          this.color,
          this.colorBlendMode,
          this.fit,
          this.alignment = Alignment.center,
          this.repeat = ImageRepeat.noRepeat,
          this.centerSlice,
          this.matchTextDirection = false,
          this.gaplessPlayback = false,
          String package,
          this.filterQuality = FilterQuality.low,
        }) : image = scale != null
               ? ExactAssetImage(name, bundle: bundle, scale: scale, package: package)
               : AssetImage(name, bundle: bundle, package: package),
             loadingBuilder = null,
             assert(alignment != null),
             assert(repeat != null),
             assert(matchTextDirection != null),
             super(key: key);
  • new Image.file: 加载本地图片文件。
    • 命名构造方法,加载本地图片,就是加载本地文件中的图片,这个是一个绝对路径,跟包体无关。 用于从File获取图像
    • 其实就相当于第一种构造方法指定 ImageProvider 为 FlieImage
    • 加载一个本地 File 图片,比如相册中的图片,用法如下
      new Image.file(new File('/storage/xxx/xxx/test.jpg'))
    • 构造函数
       Image.file(
          File file, {
          Key key,
          double scale = 1.0,
          this.frameBuilder,
          this.semanticLabel,
          this.excludeFromSemantics = false,
          this.width,
          this.height,
          this.color,
          this.colorBlendMode,
          this.fit,
          this.alignment = Alignment.center,
          this.repeat = ImageRepeat.noRepeat,
          this.centerSlice,
          this.matchTextDirection = false,
          this.gaplessPlayback = false,
          this.filterQuality = FilterQuality.low,
        }) : image = FileImage(file, scale: scale),
             loadingBuilder = null,
             assert(alignment != null),
             assert(repeat != null),
             assert(filterQuality != null),
             assert(matchTextDirection != null),
             super(key: key);
  • new Image.network: 加载网络图片。
    • 命名构造方法,用于从URL地址获取图像。意思就是你需要加入一段http://xxxx.xxx的这样的网络路径地址。
      new Image.network('http://n.sinaimg.cn/sports/2_img/upload/cf0d0fdd/107/w1024h683/20181128/pKtl-hphsupx4744393.jpg')
    • 其实就相当于第一种构造方法指定 ImageProvider 为 NetworkImage。
    • 有的时候我们需要像Android那样使用一个占位图或者图片加载出错时显示某张特定的图片,这时候需要用到 FadeInImage 这个组件:

      //第一种方法是加载一个本地的占位图
      new FadeInImage.assetNetwork(
        placeholder: 'images/logo.png',
        image: imageUrl,
        width: 120,
        fit: BoxFit.fitWidth,
      )

      //第二种是加载一个透明的占位图,但是需要注意的是,这个组件是不可以设置加载出错显示的图片的
      new FadeInImage.memoryNetwork( placeholder: kTransparentImage, image: imageUrl, width: 120, fit: BoxFit.fitWidth, )

        //另一种方法可以使用第三方 package 的 CachedNetworkImage 组件:CachedNetworkImage 组件中的占位图是一个 Widget,这样的话就可以自定义了,你想使用什么样的组件进行占位都行,同样加载出错的占位图也是一个组件,也可以自己定义;该组件也是通过缓存来加载图片的。

       new CachedNetworkImage(
        width: 120,
         fit: BoxFit.fitWidth,
         placeholder: new CircularProgressIndicator(),
         imageUrl: imageUrl,
         errorWidget: new Icon(Icons.error),
        )

    • 构造函数
        Image.network(
          String src, {
          Key key,
          double scale = 1.0,
          this.frameBuilder,
          this.loadingBuilder,
          this.semanticLabel,
          this.excludeFromSemantics = false,
          this.width,
          this.height,
          this.color,
          this.colorBlendMode,
          this.fit,
          this.alignment = Alignment.center,
          this.repeat = ImageRepeat.noRepeat,
          this.centerSlice,
          this.matchTextDirection = false,
          this.gaplessPlayback = false,
          this.filterQuality = FilterQuality.low,
          Map<String, String> headers,
        }) : image = NetworkImage(src, scale: scale, headers: headers),
             assert(alignment != null),
             assert(repeat != null),
             assert(matchTextDirection != null),
             super(key: key);
  • new Image.memory: 加载Uint8List资源图片。
    • 用来将一个 byte 数组加载成图片
      new Image.memory(bytes)
    • 命名构造函数
        Image.memory(
          Uint8List bytes, {
          Key key,
          double scale = 1.0,
          this.frameBuilder,
          this.semanticLabel,
          this.excludeFromSemantics = false,
          this.width,
          this.height,
          this.color,
          this.colorBlendMode,
          this.fit,
          this.alignment = Alignment.center,
          this.repeat = ImageRepeat.noRepeat,
          this.centerSlice,
          this.matchTextDirection = false,
          this.gaplessPlayback = false,
          this.filterQuality = FilterQuality.low,
        }) : image = MemoryImage(bytes, scale: scale),
             loadingBuilder = null,
             assert(alignment != null),
             assert(repeat != null),
             assert(matchTextDirection != null),
             super(key: key);
        

四,参数详解

  • image
    从哪里加载图片,值为一个 ImageProvider 对象,ImageProvider 的实现类有 AssetBundleImageProvider(AssetImage 继承自它)、FileImageMemoryImageNetworkImage,需要注意的是,如果选择 AssetImage 从资源目录中加载图片,需在 pubspec.yaml 配置文件中配置 assets 目录:上面有介绍
  • width 和 heigh: 宽和高
  • alignment:

    如果图片没有填充满容器的话,图片的对齐方式,值为一个 AlignmentGeometry 对象,Alignment 是它的一个实现类,可选值同 ContainerAlignment 取值一样。

        Alignment.topLeft:垂直靠顶部水平靠左对齐。
        Alignment.topCenter:垂直靠顶部水平居中对齐。
        Alignment.topRight:垂直靠顶部水平靠右对齐。
        Alignment.centerLeft:垂直居中水平靠左对齐。
        Alignment.center:垂直和水平居中都对齐。
        Alignment.centerRight:垂直居中水平靠右对齐。
        Alignment.bottomLeft:垂直靠底部水平靠左对齐。
        Alignment.bottomCenter:垂直靠底部水平居中对齐。
        Alignment.bottomRight:垂直靠底部水平靠右对齐。

     除了上面的常量之外,还可以创建 Alignment 对象指定 xy 偏移量。

  • color
    在图片上设置颜色,值为一个 Color 对象,会覆盖 image 指定的图片,如果也设置了 colorBlendMode 属性,则会与 image 混合产生特殊效果。
  • colorBlendMode
    颜色混合模式,类似 BoxDecorationbackgroundBlendMode
  • excludeFromSemantics
    是否启用图像的语义描述。
  • filterQuality
    图像过滤器的质量级别(使用该属性还没看到效果,后面用到了再研究)。
  • fit:

    图片的缩放方式,类似 Android 中 ImageViewscaleType,可选值有:

       BoxFit.none:将图片的内容按原大小居中显示。
       BoxFit.contain:将图片的内容完整居中显示,通过按比例缩小或原来的 size 使得图片宽/高等于或小于组件的宽/高,类似 Android 的 centerInside。
       BoxFit.cover:按比例放大图片的 size 居中显示,类似 Android 的 centerCrop。
       BoxFit.fill:把图片不按比例放大/缩小到组件的大小显示,类似 Android 的 fitXY。
       BoxFit.fitHeight:把图片的高按照组件的高显示,宽等比例放大/缩小。
       BoxFit.fitWidth:把图片的宽按照组件的宽显示,高等比例放大/缩小。
       BoxFit.scaleDown:如果图片宽高大于组件宽高,则让图片内容完全居中显示,此时同 contain,如果图片宽高小于组件宽高,则按图片原大小居中显示,此时同 none。
  • centerSlice
      该属性用于的中心拉伸,值为一个 Rect 对象,应该就是拉伸区域,我在使用该属性的时候只有当 fit 设置为 contain 和 fill 时才看到了效果,该属性应该也是用于图形变换,不常用。
    • 使用方法
      centerSlice =  Rect.fromLTRB(l, t, r, b)
  • gaplessPlayback
    当 ImageProvider 发生变化后,重新加载图片的过程中,原图片的展示是否保留。true 表示保留,false 表示不保留,直接空白等待下一张图片加载。
  • matchTextDirection

    该属性值表示图片的方向是否跟随文字的方向,其实就相当于左右翻转,true 表示翻转,false 表示不翻转,但是要想该属性生效,必须使用 Directionality 组件包裹 Image 组件,如下面代码:

    new Directionality(
    textDirection: TextDirection.rtl,
    child: new Image(
    image: new NetworkImage(imgUrl),
    matchTextDirection: true,
    ),
    )

  • repeat:

    如果图片没填充满容器的话,图片的重复方式,可选值有:

    •  ImageRepeat.noRepeat:不重复。

    • ImageRepeat.repeat:X、Y 轴都重复。


    • ImageRepeat.repeatX:只在 X 轴重复。


    • ImageRepeat.repeatY:只在 Y 轴重复。

  • semanticLabel:
    图像的语义描述,类似 Android 中 ImageView 的 contentDescription 属性。


五,示例demo

六,官网地址

原文地址:https://www.cnblogs.com/lxlx1798/p/11060601.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要讲解了“FlutterComponent动画的显和隐怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究...
这篇文章主要讲解了“flutter微信聊天输入框功能如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“f...
本篇内容介绍了“Flutter之Navigator的高级用法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处...
这篇文章主要介绍“Flutter怎么使用Android原生播放器”,在日常操作中,相信很多人在Flutter怎么使用Android原生播放器问题上存在疑惑,小编查阅了各式资料,整...
Flutter开发的android端如何修改APP名称,logo,版本号,具体的操作步骤:修改APP名称找到文件:android\\app\\src\\main\\AndroidManifest.xml
Flutter路由管理初识路由概念一.路由管理1.1.Route1.2.MaterialPageRoute1.3.Navigator1.4.路由传值1.5 命名路由1.6.命名路由参数传递1.7.适配二、路由钩子三、onUnknownRoute四、结尾初识路由概念路由的概念由来已久,包括网络路由、后端路由,到现在广为流行的前端路由。无论路由的概念如何应用,它的核心是一个路由映射表。比如:名字 detail 映射到 DetailPage 页面等。有了这个映射表之后,我们就可以方便的根据名字来完成路由的转发
前提:针对Android开发者(windows系统下),已安装Git,AndroidStudio(建议4.0+版本)一.下载Flutter SDK地址:https://flutter.dev/docs/development/tools/sdk/releases,在 Stable channel (Windows)里面下最新版本即可。Flutter的渠道版本会不停变动,请以Flutter官网为准。在中国,要想正常获取安装包列表或下载安装包,可能需要翻墙,也可以去Flutter github项目下去下载安
一、变量变量是一个引用,根据Dart中“万物皆对象”原则,即变量存储的都是对象的引用,或者说它们都是指向对象。1.1.声明变量://1.不指定类型var name = 'aaa';//2.明确指定类型String name = 'aaa';因为有类型推导,所以两种实现效果一样,官方推荐在函数内的本地变量尽量使用var声明。在变量类型并不明确的情况下,可以使用dynamic关键字//3.使用dynamic关键字dynamic name = 'aaa';1.2.默认值未初始化的变量
前言Flutter2.0发布不久,对web的支持刚刚进入stable阶段。初学几天,构建web应用时候碰到一些问题,比如中文显示成乱码,然后加载图片出现图片跨域问题:Failed to load network image...Trying to load an image from another domain?1.开启web端构建:使用下面这个命令才可以开启Web端构建的支持flutter config --enable-web提示我们:重新启动编辑器,以便它们读取新设置。2.重
一.Flutter打Android release包的步骤:1.为项目创建一个.jks签名文件(很简单,跳过)2.创建一个文件key.properties,直接复制下面key.properties位置如图:在里面输入一下内容:storePassword=iflytekkeyPassword=iflytekkeyAlias=teachingmachinestoreFile=E:/teacher/app/keys/TeachingMachine.jks输入你自己的passwork以及
1 问题Android原生向js发消息,并且可以携带数据2 实现原理Android原生可以使用RCTEventEmitter来注册事件,然后这里需要指定事件的名字,然后在js那端进行监听同样事件的名字监听,就可以收到消息得到数据Android注册关键代码reactContext.getJSModule(DeviceEventManagerModule.RCT...
1 Flexbox布局1) flexDirection 可以决定布局的主轴,子元素是应该沿着水平轴(row)方向排列,还是沿着竖直轴(column)方向排列2) justifyContent 决定其子元素沿着次轴(与主轴垂直的轴,比如若主轴方向为row,则次轴方向为column)的排列方式 有flex-start、center、flex-end、space-around...
1 实现的功能在网上看React Native文档,我特码就想实现一个页面到另外一个页面的跳转,然后另外一个页面怎么获取参数,特么没找到一个说清楚的,要么太复杂,要么说了不理解,下面是我自己写的一个App.js文件,实现一个Home页面跳到另外Details页面,并且携带了参数怎么在Details页面获取,就是这么简单粗暴.2 测试DemoApp.js文件如下...
1 问题在一个文件构建一个对象,然后在另外一个文件里面new这个对象,通过构造方法传递参数,然后再获取这个参数2 测试代码Student.js文件如下'use strict';import React from 'react'import {NativeModules, NativeEventEmitter, DeviceEventEmitter,Ale...
1 简单部分代码export default class App extends Component&amp;lt;Props&amp;gt; { render() { return ( &amp;lt;View {styles.container}&amp;gt; &amp;lt;View {styles.welcome}&amp;gt; &amp;l...
1 怎么实现发送和接收事件理论上封装了Android原生广播的代码,需要注册和反注册,这里用DeviceEventEmitter实现//增加监听DeviceEventEmitter.addListener//取消监听//this.emitter.remove();这里可也可以通过安卓原生向页面js发送消息,可以参考我的这篇博客React Native之Android原生通过Dev...
1、Component介绍一般Component需要被其它类进行继承,Component和Android一样,也有生命周期英文图片如下2 具体说明1)、挂载阶段constructor()//构造函数,声明之前先调用super(props)componentWillMount()//因为它发生在render()方法前,因此在该方法内同步设置状态...
1 触摸事件普通点击我们可以使用onPress方法,我们可以使用Touchable 系列控件设计我们的按钮TouchableHighlight 背景会在用户手指按下时变暗TouchableNativeFeedback用户手指按下时形成类似墨水涟漪的视觉效果TouchableOpacity指按下时降低按钮的透明度,而不会改变背景的颜色TouchableWithoutFeedbac...
1 问题部分代码如下class HomeScreen extends React.Component { render() { return ( &amp;lt;View {{ flex: 1, alignItems: 'center', justifyContent: 'center' }}&amp;gt; &amp;lt;Text&amp;gt;Home Scre...
1 Props(属性)和State(状态)和简单样式简单使用App.js代码如下/** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow */import React, {Component} from 'react';import {Pla...