Flutter控件之 Text

   Text(
        "Text组件的使用",
        style: TextStyle(
            // 文字颜色
            color: Color(0xfff0000),
            // none 不显示装饰线条,underline 字体下方,overline 字体上方,lineThrough穿过文字
            decoration: TextDecoration.none,
            // solid 直线,double 双下划线,dotted 虚线,dashed 点下划线,wavy 波浪线
            decorationStyle: TextDecorationStyle.solid,
            // 装饰线的颜色
            decorationColor: Colors.red,
            // 文字大小
            fontSize: 15.0,
            // normal 正常,italic 斜体
            fontStyle: FontStyle.normal,
            // 字体的粗细
            fontWeight: FontWeight.bold,
            // 文字间的宽度
            letterSpacing: 1.0,
            // 文本行与行的高度,作为字体大小的倍数(取值1~2,如1.2)
            height: 1,
            //对齐文本的水平线:
            //TextBaseline.alphabetic:文本基线是标准的字母基线
            //TextBaseline.ideographic:文字基线是表意字基线;
            //如果字符本身超出了alphabetic 基线,那么ideograhpic基线位置在字符本身的底部。
            textBaseline: TextBaseline.alphabetic),
        // 段落的间距样式
        strutStyle: StrutStyle(
          fontFamily: 'serif',
          fontFamilyFallback: ['monospace', 'serif'],
          fontSize: 20,
          height: 2,
          leading: 2.0,
          fontWeight: FontWeight.w300,
          fontStyle: FontStyle.normal,
          forceStrutHeight: true,
          debugLabel: 'text demo',
        ),
        // 文字对齐方式
        textAlign: TextAlign.center,
        // 文字排列方向 ltr 左到右,rtl右到左
        textDirection: TextDirection.ltr,
        // 用于选择区域特定字形的语言环境
        locale: Locale('zh_CN'),
        // 软包裹 ,文字是否应该在软断行出断行
        softWrap: false,
        // 如何处理视觉溢出:clip 剪切溢出的文本以修复其容器。ellipsis 使用省略号表示文本已溢出。fade 将溢出的文本淡化为透明。
        overflow: TextOverflow.clip,
        // 文字的缩放比例
        textScaleFactor: 1.0,
        // 文本要跨越的可选最大行数,
        maxLines: 2,
        // 图像的语义描述,用于向Andoid上的TalkBack和iOS上的VoiceOver提供图像描述
        semanticsLabel: 'text demo',
        textWidthBasis: TextWidthBasis.longestLine,
      )

Flutter控件之 Text - 简书

Flutter基础组件<Image和Icon>

一、Image

Flutter中的Image有点类似于Android中的ImageView,它的作用是加载并显示图片,图片的来源可以是asset、文件、内存以及网络。

在Flutter中,加载图片的任务是交给ImageProvider来完成的。ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvider ,如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。

接下来看看Image是如何加载图片的。

  • 加载asset图片

1. 在工程根目录下创建一个images目录,并将图片start_icon.png拷贝到该目录。

2. 添加asset图片资源,在pubspec.yaml中的flutter部分添加如下内容:

flutter:
  ……
  assets:
    - images/star_icon.png


3. 加载图片

Image(image: AssetImage("images/star_icon.png"),
      width: 30, height: 30,)

Image还提供了一个快捷的构建方法Image.asset:

 Image.asset("images/star_icon.png",
       width: 30, height: 30,)

两种方式达到d效果是一样的,效果图如下:

 

  • 加载网络图片

与加载asset类似,加载网络图片也有快捷方法,下面是两种加载方法:

Image(
  image: NetworkImage(
      "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg"),
  width: 200,
  height: 200,
  fit: BoxFit.fitHeight,
),
//快捷方式
Image.network(
  "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg",
  width: 200,
  height: 200,
  fit: BoxFit.fitHeight,
)

运行效果:

  • Image属性

Image在显示图片时定义了一系列参数,通过这些参数我们可以控制图片的显示外观、大小、混合效果等。我们看一下Image的主要参数:

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

1、width、height:用于设置图片的宽、高,当不指定宽高时,图片会根据当前父容器的限制,尽可能的显示其原始大小,如果只设置width、height的其中一个,那么另一个属性默认会按比例缩放,但可以通过下面介绍的fit属性来指定适应规则。

2、fit:该属性用于在图片的显示空间和图片本身大小不同时指定图片的适应模式,有点类似于Android 中ImageView的scaleType属性。适应模式是在BoxFit中定义,它是一个枚举类型,有如下值:

  • fill:会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。
  • cover:会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。
  • contain:这是图片的默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。
  • fitWidth:图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
  • fitHeight:图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
  • none:图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。


 

3、color和 colorBlendMode:在图片绘制时可以对每一个像素进行颜色混合处理,color指定混合色,而colorBlendMode指定混合模式。

Image(
  image: NetworkImage(
      "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg"),
  width: 200,
  height: 200,
  fit: BoxFit.fitHeight,
),
Image.network(
  "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg",
  width: 200,
  height: 200,
  color: Colors.green,
  colorBlendMode: BlendMode.color,
  fit: BoxFit.fitHeight,
)

4、repeat:当图片本身大小小于显示空间时,指定图片的重复规则。

Image.asset(
  "images/star_icon.png",
  width: 100,
  height: 100,
),
Image.asset(
  "images/star_icon.png",
  width: 100,
  height: 100,
  repeat: ImageRepeat.repeatX,
),
Image.asset(
  "images/star_icon.png",
  width: 100,
  height: 100,
  repeat: ImageRepeat.repeatY,
)

重复效果如下:

二、Icon

Flutter中,可以像Web开发一样使用iconfont,iconfont即“字体图标”,它是将图标做成字体文件,然后通过指定不同的字符而显示不同的图片。

在字体文件中,每一个字符都对应一个位码,而每一个位码对应一个显示字形,不同的字体就是指字形不同,即字符对应的字形是不同的。而在iconfont中,只是将位码对应的字形做成了图标,所以不同的字符最终就会渲染成不同的图标。

在Flutter开发中,iconfont和图片相比有如下优势:

  1. 体积小:可以减小安装包大小。
  2. 矢量的:iconfont都是矢量图标,放大不会影响其清晰度。
  3. 可以应用文本样式:可以像文本一样改变字体图标的颜色、大小对齐等。
  4. 可以通过TextSpan和文本混用。

使用Material Design字体图标

Flutter默认包含了一套Material Design的字体图标,在pubspec.yaml文件中的配置如下


Material Design所有图标可以在其官网查看:https://material.io/tools/icons/

Icon(
  Icons.accessible,
  size: 60,
  color: Colors.green,
),
Icon(
  Icons.error,
  color: Colors.green,
),
Icon(
  Icons.fingerprint,
  color: Colors.green,
)

运行效果:

 

使用自定义字体图标

Flutter也支持使用自定义字体图标。素材库上有很多字体图标素材,我们可以选择自己需要的图标打包下载后,会生成一些不同格式的字体文件,在Flutter中,我们使用ttf格式。

1、准备好ttf素材文件,在根目录创建fonts文件夹,把素材文件放入该目录


 

2、在pubspec.yaml文件中导入tff文件

 

 

fonts:
  - family: myIcon  #指定一个字体名
    fonts:
      - asset: fonts/iconfont.ttf

3、为了使用方便,我们模仿Icons类,编写一个自定义的MyIcons类

class MyIcons {
  static const IconData xiyiji = const IconData(
      0xe71c,
      fontFamily: 'iconfont',
  );
}

4、使用我们自定义的字体图标

Icon(
  MyIcons.xiyiji, //自定义字体图标
  color: Colors.purple,
),

 

Flutter基础组件<Image和Icon> - 简书

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐