• Flutter 基础组件:图片和Icon


    前言

    Flutter中,可以通过Image组件来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。
    ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvider ,如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。
    Image widget有一个必选的image参数,它对应一个ImageProvider。

    实例

    // 图片、Icon
    
    
    import 'package:flutter/material.dart';
    
    class ImageRoute extends StatelessWidget {
    
      @ override
      Widget build(BuildContext context) {
        var assetImg = AssetImage('assets/images/辣椒.png');
        var networkImg = NetworkImage('https://avatars2.githubusercontent.com/u/20411648?s=460&v=4');
    
        return SingleChildScrollView(
          child: Column(
            children: <Image>[
    
              // 从assets中加载图片
              Image(
                image: assetImg,
                 100.0,
              ),
    
              // 从网络加载图片
              Image(
                image: networkImg,
                 100.0,
              ),
    
              Image(
                image: networkImg,
                // width、height:用于设置图片的宽、高,当不指定宽高时,图片会根据当前父容器的限制,尽可能的显示其原始大小,
                // 如果只设置width、height的其中一个,那么另一个属性默认会按比例缩放,但可以通过fit属性来指定适应规则。
                 100.0,
                height: 200.0,
                // 图片的混合色值
                color: Colors.blue,
                // 图片的混合模式
                colorBlendMode: BlendMode.difference,
                // 对齐方式
                alignment: Alignment.center,
                // 重复方式,当图片本身大小小于显示空间时,指定图片的重复规则
                repeat: ImageRepeat.repeatY,
              ),
    
              // 下面来讨论fit属性
              Image(
                image: networkImg,
                height: 50.0,
                 100.0,
                // 会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。
                fit: BoxFit.fill,
              ),
              Image(
                image: networkImg,
                height: 50,
                 50.0,
                // 默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。
                fit: BoxFit.contain,
              ),
              Image(
                image: networkImg,
                 100.0,
                height: 50.0,
                // 会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。
                fit: BoxFit.cover,
              ),
              Image(
                image: networkImg,
                 100.0,
                height: 50.0,
                // 图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
                fit: BoxFit.fitWidth,
              ),
              Image(
                image: networkImg,
                 100.0,
                height: 50.0,
                // 图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
                fit: BoxFit.fitHeight,
              ),
              Image(
                image: networkImg,
                 100.0,
                height: 50.0,
                // 图片按比例适应。
                fit: BoxFit.scaleDown,
              ),
              Image(
                image: networkImg,
                height: 50.0,
                 100.0,
                // 图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。
                fit: BoxFit.none,
              ),
    
            ].map((e){
              return Row(
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.all(10.0),
                    child: SizedBox(
                       100,
                      child: e,
                    ),
                  ),
                  Text(e.fit.toString())
                ],
              );
            }).toList(),
          ),
        );
      }
    
    }
    
    class MyIcons{
      // 微信图标
      static IconData weChat = const IconData(0xe620, fontFamily: 'MyIcon', matchTextDirection: true);
    
      // 新春图标
      static IconData newYear = const IconData(0xe64a, fontFamily: 'MyIcon', matchTextDirection: true);
    }
    
    class IconRoute extends StatelessWidget {
    
      @override
      Widget build(BuildContext context) {
        return Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用Material Design字体图标
            Icon(Icons.accessible, color: Colors.green,),
            Icon(Icons.error, color: Colors.green,),
            Icon(Icons.fingerprint, color: Colors.green,),
            // 使用自定义字体图标
            Icon(MyIcons.weChat, color: Colors.green,),
            Icon(MyIcons.newYear, color: Colors.green,),
    
          ],
        );
      }
    
    }
    
    

    注意点

    1. 使用自定义字体图标时,下载资源是要注意,在iconfont.cn选取图标后,加到项目中,点击“下载到本地”,注意:这里下载只能浏览器,不能用迅雷等插件。
    2. 下载成功后,将iconfont.ttf文件放在项目文件下,进行pubspec.yaml的配置。使用时,打开下载文件中的html页面或者在个人中心中得到图标的Unicode,但是这个Unicode不能直接用,例如得到“微信”的Unicode为“&#xe620”,使用时改为“0xe620”,这时,可能IDE显示的图标对应不上,但是热重载后图标会显示成功。
  • 相关阅读:
    小程序全局生命周期( 仅供了解 )
    iview表格render小案例2
    iview中表格根据条件渲染
    如何实现页面同时在移动端和pc端的兼容问题
    小程序页面中的生命周期( 仅供了解 )
    弹性盒基本属性
    elementUI实现分页效果+模糊搜索效果
    事件流 ---- 事件冒泡与事件捕获
    React生命周期
    数据库索引数据结构btree,b-tree和b+tree树
  • 原文地址:https://www.cnblogs.com/parzulpan/p/12060999.html
Copyright © 2020-2023  润新知