第六节:Flutter 中Image 图片组件

Flutter中,我们可以通过Image组件来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。


1. Image 组件

Image widget有一个必选的image参数,它对应一个ImageProvider。


1.1 ImageProvider

介绍:

  1. ImageProvider 是一个抽象类,定义获取图片数据的接口load()
  2. 不同的数据源获取图片需要实现不同的ImageProvider
  3. AssetImage是实现了Asset中加载图片的ImageProvider
  4. NetworkImage实现了从网络加载图片的ImageProvider

接下来通过示例了解Image组件的使用


2. 通过Image组件获取图片

2.1 加载本地图片
2.1.1 加载本地图片基本使用

从本地asset中加载图片说明:

  1. 在工程目录下创建images目录,将本地图片拷贝到这个目录中

  2. 在pubspec.yaml中的flutter部分添加如下内容

    assets:
     - image/avatar.png
    
  3. 加载该图片

    Image(
     image: AssetImage("images/avatar.png"),
        width: 100.0
    )
    

示例:

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                // 容器的子组件是图片组件
                child: Image(
                    // 图片组件image参数为本地图片
                    image: AssetImage("images/user.jpg"),
                    width: 100.0
                ),

                width: 200.0,               // 容器宽度
                height: 200.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}

显示结果:

本地图片_图.png


2.1.2 本地图片使用的快捷方式

Image也提供了一个快捷的构造函数Image.asset用于从asset中加载、显示图片:

修改上面的示例代码

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Image.asset(          // Image 本地资源加载的快捷方式
                    "images/user.jpg",       // 图片地址
                ),

                width: 200.0,                // 容器宽度
                height: 200.0,               // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}

显示的结果也是一样的.


2.2 加载网络图片
2.2.1 基本使用

使用NetworkImage组件加载网络图片

示例:

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Image(
                    // 网络图片资源
                    image: NetworkImage(
                        "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1590211082973&di=b0aea5b44cd961615aea0d7e0ae6334c&imgtype=0&src=http%3A%2F%2Fhiphotos.baidu.com%2Fyzcs1023023%2Fpic%2Fitem%2Face54525742084dd935807a4.jpg"
                    )
                ),

                width: 200.0,               // 容器宽度
                height: 200.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}

显示结果:

网络图片_图2.png


2.2.2 网络图片加载的快捷方式

Image也提供了一个快捷的构造函数Image.network用于从网络加载、显示图片:

修改上面的实例代码

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                // 代码不同的位置,
                child: Image.network(
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1590211082973&di=b0aea5b44cd961615aea0d7e0ae6334c&imgtype=0&src=http%3A%2F%2Fhiphotos.baidu.com%2Fyzcs1023023%2Fpic%2Fitem%2Face54525742084dd935807a4.jpg"
                ),

                width: 200.0,               // 容器宽度
                height: 200.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}


3. Image组件常用参数

3.1 常用参数
const Image({
    ...
    this.width, //图片的宽
    this.height, //图片高度
    this.color, //图片的混合色值
    this.colorBlendMode, //混合模式
    this.fit,//缩放模式
    this.alignment = Alignment.center, //对齐方式
    this.repeat = ImageRepeat.noRepeat, //重复方式
    ...
})


3.2 常用参数以及值的了解
名称 类型 说明
alignment Alignment 图片的对齐方式, 使用Alignment构造函数掉调用方位:<br />1. Alignment.topLeft: 左上角对齐<br />2. Alignment.topcenter: 顶部居中对齐<br />3. Alignment.topright: 右上角对齐<br />4. Alignment.centerleft: 左侧居中对齐<br />5. Alignment.center: 正中对齐<br />6. Alignment.centerright: 右侧居中对齐<br />7. Alignment.bottomleft: 左下角对齐<br />8. Alignment.bottomcenter: 底部居中对齐<br />9. Alignment.bottomright: 右下角对齐
color和colorBlendMode 设置图片的背景颜色,通常和colorBlendMode配合在一起使用<br />这样可以是图片颜色和背景颜色混合
fit BoxFix fit属性: 用来控制图片的拉伸和挤压,这都是根据父容器来的<br />1.BoxFit.fill: 全图显示,图片会被拉伸,并充满父容器<br />2.BoxFit.contain:全图显示.显示原比例,可能会有空隙<br />3.BoxFit.cover: 显示可能拉伸,可能裁剪,充满(图片充满整个容器,但不变形)<br />4.BoxFit.fitWidth: 宽度充满,显示可能拉升可能裁剪<br />5.BoxFit.fitHeight: 高度充满,显示可能拉伸,可能裁切<br />6.BoxFit.scaleDown:效果和contain差不多,但是此属性不允许显示超过原图片大小,可小不可大
repeat 平铺 ImageRepeat.repeat: 横向和纵向都进行重复,直到铺满整个画布<br />ImageRepeat.repeatX:横向重复,纵向不重复<br />ImageRepeat.repeatY:纵向重复,横向不重复
width 宽度: 一般结合ClipOval才能看到效果
height 高度: 一般结合ClipOval才能看到效果


3.3 参数说明
  1. widthheight:用于设置图片的宽、高.一般结合ClipOval组件使用才能看到效果
    • 不指定宽高时,图片根据当前父容器的限制,尽可能显示其原始图片
    • 如果width,height只设置其中一个值, 另一个属性按比例缩放
  2. fit :该属性用于在图片的显示空间和图片本身大小不同时指定图片的适应模式,某事在BoxFit中定义
    • fill:会拉伸填充满显示空间,图片会变形。
    • cover: 按图片原有比例缩放,铺满整个空间,超出的背剪切
    • contain: 图片默认适应的规则,安装图片原有比例缩放值空间适当显示
    • fitWidth: 图片宽度缩放到显示空间的宽度, 图片会按原有比例缩放, 不变形,超出的被裁剪
    • fitHeight: 图片高度缩放到显示空间的宽度, 图片会按原有比例缩放, 不变形,超出的被裁剪
    • none: 图片没有适应策略, 会在显示空间内显示图片,如果图片过大,只会显示图片中间的部分


3.4 示例:
3.4.1 测试fit参数

代码写法:

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Image.network(
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1590211082973&di=b0aea5b44cd961615aea0d7e0ae6334c&imgtype=0&src=http%3A%2F%2Fhiphotos.baidu.com%2Fyzcs1023023%2Fpic%2Fitem%2Face54525742084dd935807a4.jpg"
                    ,
                    fit: BoxFit.cover,  // 修改自出,查看不同的值对应的变化
                ),

                width: 200.0,               // 容器宽度
                height: 200.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}

显示结果:

BoxFit.cover_图3.png


3.4.2 测试 alignment参数

代码:

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Image.network(
                    "http://cli.oss.aliyuncs.com/2015/04/22/21f5deae6515c6c8a8834c5a65506971.jpg",

                    // 定义图片在父容器的九宫方位
                    alignment: Alignment.topRight
                ),

                width: 400.0,               // 容器宽度
                height: 400.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}

显示结果

alignment_图4.png

示例是右上角对齐, 其他对齐方式请自己一一测试.自己测试才会记得更熟哦


3.4.3 背景颜色和图片颜色混合模式

代码:


class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Image.network(
                  "http://cli.oss.aliyuncs.com/2015/04/22/21f5deae6515c6c8a8834c5a65506971.jpg",
                    color: Colors.blue,                  // 图片的背景颜色
                    colorBlendMode:BlendMode.colorDodge  // 图片背景颜色和图片颜色混合
                ),

                width: 400.0,               // 容器宽度
                height: 400.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}

显示结果

colorblendmode_图5.png

注意: BlendMode组件有很多混合模式, 自己可以一一测试.


3.4.4 图片重复:

代码:

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(
                child: Image.network(
                    "http://cli.oss.aliyuncs.com/2015/04/22/21f5deae6515c6c8a8834c5a65506971.jpg",

                    repeat: ImageRepeat.repeat        // 背景平铺
                    // repeat: ImageRepeat.repeatY    // Y轴平铺
                    // repeat: ImageRepeat.repeatY    // X轴平铺
                    // repeat: ImageRepeat.noRepeat   // 不平铺
                ),

                width: 400.0,               // 容器宽度
                height: 400.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
                ),
            )
        );
    }
}

显示结果:

repeat_图6.png


4. 图片的其他定义方式

图片除了在容器的child参数中配置,还可以在decoration 描述参数中配置

如果在decoration 描述参数中配置,需要使用DecorationImage组件来处理图片的引入

同时还要注意,在decoration中 Image.network快捷引入图片的方式不能使用, 还是要用NetworkImage组件

示例:

代码:

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(
            child: Container(

                width: 200.0,               // 容器宽度
                height: 200.0,              // 容器的高度
                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色
               
                    // 在容器的描述中加载图片
                    image: DecorationImage(
                        image: NetworkImage(
                            "http://cli.oss.aliyuncs.com/2015/04/22/21f5deae6515c6c8a8834c5a65506971.jpg",
                        ),
                    )
                ),
            )
        );
    }
}

图片正常加载


5. 圆形图片

5.1 容器描述中配置圆形图片

圆形图片说明:

  1. 在容器中使用child参数配置的图片在decoration中配置圆角,但是图片不会有圆角
  2. 配置圆角图片,图片需要在decoration中配置


代码

Widget build(BuildContext content){
    return Center(
        child: Container(

            width: 200.0,               // 容器宽度
            height: 200.0,              // 容器的高度
            decoration: BoxDecoration(
                color: Colors.green,     // decoration中也有color,背景颜色
                // 配置圆角
                borderRadius: BorderRadius.all(
                    Radius.circular(100.0)
                ),

                // 描述中配置图片
                image: DecorationImage(
                    image: NetworkImage(
                        "http://cli.oss.aliyuncs.com/2015/04/22/21f5deae6515c6c8a8834c5a65506971.jpg",
                    ),
                )
            ),
        )
    );
}
}

显示结果:

圆角图片_图7.png


5.2 在ClipOval中配置圆角图片

ClipOval 会根据图片大小切成圆角, 图片是正方形会切成圆形, 图片如果是长方形,会切成椭圆形

5.2.1 更加图片大小切成椭圆

代码

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(

            child: Container(

                // ClipOval 自动根据图片的大小切成圆角
                child: ClipOval(
                    child: Image.network(
                        "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1590211082973&di=b0aea5b44cd961615aea0d7e0ae6334c&imgtype=0&src=http%3A%2F%2Fhiphotos.baidu.com%2Fyzcs1023023%2Fpic%2Fitem%2Face54525742084dd935807a4.jpg"
                    )
                ),

                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色

                ),
            )
        );
    }
}


显示结果

ClipOval椭圆_图8.png


5.2.2 通过改变图片width 和height 变成圆形

在ClipOval中就可以使用widthheight参数了, 通过这两个参数变成正圆

代码

class Home extends StatelessWidget{
    @override
    Widget build(BuildContext content){
        return Center(

            child: Container(

                // ClipOval 自动根据图片的大小切成圆角
                child: ClipOval(
                    child: Image.network(
                        "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1590211082973&di=b0aea5b44cd961615aea0d7e0ae6334c&imgtype=0&src=http%3A%2F%2Fhiphotos.baidu.com%2Fyzcs1023023%2Fpic%2Fitem%2Face54525742084dd935807a4.jpg",
                        width:200.0,
                        height:200.0,
                        fit: BoxFit.cover
                    )
                ),

                decoration: BoxDecoration(
                    color: Colors.green,     // decoration中也有color,背景颜色

                ),
            )
        );
    }
}

显示结果:

圆形图片_图9.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343