【Flutter实战】图片组件及四大案例

移动开发 作者: 2024-08-25 11:00:02
老孟导读:大家好,这是【Flutter实战】系列文章的第三篇,这一篇讲解图片组件,Image有很多高级用法,希望对您有所帮助。 图片组件是Flutter基础组件之一,和文本组件一样必不可少。图片组件包
  • 通常情况下,图标比图片体积更小,显著的减少App包体积。
  • 图标不会出现失真或者模糊的现象,例如将20x20的图片,渲染在200x200的屏幕上,图片会失真或模糊,而图标是矢量图,不会失真,就像字体一样。
  • 多个图标可以存放在一个文件中,方便管理。
  • 全平台通用。

Image

Image.network(
  'http://pic1.win4000.com/pic/c/cf/cdc983699c.jpg',)
assets:
  - assets/images/
assets:
  - assets/images/aa.jpg
Image.asset('assets/images/aa.jpg')
Image.file(File('path'))
Image.asset('assets/images/aa.jpg',width: 100,height: 200,),
Container(
  color: Colors.red.withOpacity(.3),child: Image.asset('assets/images/aa.jpg',width: 150,height: 150),)
Container(
  color: Colors.red.withOpacity(.3),height: 150,fit: BoxFit.fill,)
Container(
  color: Colors.red.withOpacity(.3),fit: BoxFit.cover,)
  • fill:完全填充,宽高比可能会变。
  • contain:等比拉伸,直到一边填充满。
  • cover:等比拉伸,直到2边都填充满,此时一边可能超出范围。
  • fitWidth:等比拉伸,宽填充满。
  • fitHeight:等比拉伸,高填充满。
  • none:当组件比图片小时,不拉伸,超出范围截取。
  • scaleDown:当组件比图片小时,图片等比缩小,效果和contain一样。
Image.asset(
  'assets/images/aa.jpg',fit: BoxFit.none,alignment: Alignment.centerRight,
Container(
  color: Colors.red.withOpacity(.3),child: Image.asset(
    'assets/images/aa.jpg',alignment: Alignment.centerLeft,
  • clear:清楚源图像和目标图像。
  • color:获取源图像的色相和饱和度以及目标图像的光度。
  • colorBurn:将目标的倒数除以源,然后将结果倒数。
  • colorDodge:将目标除以源的倒数。
  • darken:通过从每个颜色通道中选择最小值来合成源图像和目标图像。
  • difference:从每个通道的较大值中减去较小的值。合成黑色没有效果。合成白色会使另一张图像的颜色反转。
  • dst:仅绘制目标图像。
  • dstATop:将目标图像合成到源图像上,但仅在与源图像重叠的位置合成。
  • dstIn:显示目标图像,但仅显示两个图像重叠的位置。不渲染源图像,仅将其视为蒙版。源的颜色通道将被忽略,只有不透明度才起作用。
  • dstOut:显示目标图像,但仅显示两个图像不重叠的位置。不渲染源图像,仅将其视为蒙版。源的颜色通道将被忽略,只有不透明度才起作用。
  • dstOver:将源图像合成到目标图像下。
  • exclusion:从两个图像的总和中减去两个图像的乘积的两倍。
  • hardLight:调整源图像和目标图像的成分以使其适合源图像之后,将它们相乘。
  • hue:获取源图像的色相,以及目标图像的饱和度和光度。
  • lighten:通过从每个颜色通道中选择最大值来合成源图像和目标图像。
  • luminosity:获取源图像的亮度,以及目标图像的色相和饱和度。
  • modulate:将源图像和目标图像的颜色分量相乘。
  • multiply:将源图像和目标图像的分量相乘,包括alpha通道。
  • overlay:调整源图像和目标图像的分量以使其适合目标后,将它们相乘。
  • plus:对源图像和目标图像的组成部分求和。
  • saturation:获取源图像的饱和度以及目标图像的色相和亮度。
  • screen:将源图像和目标图像的分量的逆值相乘,然后对结果求逆。
  • softLight:对于低于0.5的源值使用colorDodge,对于高于0.5的源值使用colorBurn。
  • src:放置目标图像,仅绘制源图像。
  • srcATop:将源图像合成到目标图像上,但仅在与目标图像重叠的位置合成。
  • srcIn:显示源图像,但仅显示两个图像重叠的位置。目标图像未渲染,仅被视为蒙版。目标的颜色通道将被忽略,只有不透明度才起作用。
  • srcOut:显示源图像,但仅显示两个图像不重叠的位置。
  • srcOver:将源图像合成到目标图像上。
  • xor:将按位异或运算符应用于源图像和目标图像。
Image.asset(
  'assets/images/aa.jpg',width: double.infinity,repeat: ImageRepeat.repeatX,)
  • repeat:x,y方向都充满。
  • repeatX:x方向充满。
  • repeatY:y方向充满。
  • noRepeat:不重复。
Directionality(
    textDirection: TextDirection.rtl,child: Image.asset(
      'assets/images/logo.png',matchTextDirection: true,)),
Image.network(
  'https://flutter.github.io/assets-for-api-docs/assets/widgets/puffin.jpg',frameBuilder: (BuildContext context,Widget child,int frame,bool wasSynchronouslyLoaded) {
    if (wasSynchronouslyLoaded) {
      return child;
    }
    return AnimatedOpacity(
      child: child,opacity: frame == null ? 0 : 1,duration: const Duration(seconds: 2),curve: Curves.eaSEOut,);
  },)
Image.network(
    'https://flutter.github.io/assets-for-api-docs/assets/widgets/puffin.jpg',loadingBuilder: (BuildContext context,ImageChunkEvent loadingProgress) {
  if (loadingProgress == null) {
    return child;
  }
  return Center(
    child: CircularProgressIndicator(
      value: loadingProgress.expectedTotalBytes != null
          ? loadingProgress.cumulativeBytesLoaded /
              loadingProgress.expectedTotalBytes
          : null,);
})
Container(
    width: 250,height: 300,decoration: BoxDecoration(
        image: DecorationImage(
            centerSlice: Rect.fromLTWH(20,20,10,10),image: AssetImage(
              'assets/images/abc.jpg',fit: BoxFit.fill))),

Icon

Icon(Icons.add),
Icon(
  Icons.add,size: 40,color: Colors.red,)

案例

聊天背景(.9图实现)

Container(
  width: 200,padding: EdgeInsets.only(left: 8,top: 8,right: 20,bottom: 8),decoration: BoxDecoration(
      image: DecorationImage(
          centerSlice: Rect.fromLTWH(20,1,1),image: AssetImage(
            'assets/images/chat.png',fit: BoxFit.fill)),child: Text('老孟,专注分享Flutter技术和应用实战。'
      '老孟,专注分享Flutter技术和应用实战。'
      '老孟,专注分享Flutter技术和应用实战。',)
centerSlice: Rect.fromLTWH(20,60),

圆形带边框的头像

Container(
  width: 100,height: 100,padding: EdgeInsets.all(3),decoration: BoxDecoration(shape: BoxShape.circle,color: Colors.blue),child: Container(
    decoration: BoxDecoration(
        shape: BoxShape.circle,image: DecorationImage(
            image: AssetImage('assets/images/aa.jpg'),fit: BoxFit.cover)),)

图片占位符:

Image.network(
  'https://flutter.github.io/assets-for-api-docs/assets/widgets/puffin.jpg',frameBuilder: (
    BuildContext context,bool wasSynchronouslyLoaded,) {
    if (frame == null) {
      return Image.asset(
        'assets/images/place.png',);
    }
    return child;
  },)

添加自己的图标库

如果没有添加过项目,需要创建一个新项目: 创建好后加入此项目,跳转到我的项目页面,点击下载: 千万注意红框内开头的空格问题,否则编译不通过,family后面跟的字符串最好有意义,后面用图标的时候需要用到。
Icon(IconData(0xe613,fontFamily: 'appIconFonts')
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_68357.html