热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter笔记Flutter的布局Widget(二)

多子布局组件在开发中,我们经常需要将多个Widget放在一起进行布局,比如水平方向、垂直方向排列,甚至有时候需要他们进行层叠࿰

多子布局组件

在开发中,我们经常需要将多个Widget放在一起进行布局,比如水平方向、垂直方向排列,甚至有时候需要他们进行层叠,比如图片上面放一段文字等;
这个时候我们需要使用多子布局组件(Multi-child layout widgets)。
比较常用的多子布局组件是Row、Column、Stack。


1. Flex组件

Row组件和Column组件都继承自Flex;


  • Flex组件和RowColumn属性主要的区别就是多一个 direction;
  • direction的值为Axis.horizontal的时候,则是Row,呈一行排布;
  • direction的值为Axis.vertical的时候,则是Column,呈一列排布;

它们都有主轴(Main Axis)和交叉轴(Cross Axis)的概念:


  • 对于Row来说,水平方向是主轴,竖直方向是交叉轴;
    Row@2x.png

  • 对于Column来说,竖直方向是主轴,水平方向是交叉轴;
    Column.png




2. Row组件

Row({Key key,MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, // 主轴对齐方式MainAxisSize mainAxisSize = MainAxisSize.max, // 水平方向尽可能大CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, // 交叉处对齐方式TextDirection textDirection, // 水平方向子widget的布局顺序(默认为系统当前Locale环境的文本方向(如中文、英语都是从左往右,而阿拉伯语是从右往左))VerticalDirection verticalDirection = VerticalDirection.down, // 表示Row纵轴(垂直)的对齐方向TextBaseline textBaseline, // 如果上面是baseline对齐方式,那么选择什么模式(有两种可选)List children = const [],
})

2.1. mainAxisSize

Row的特点:


  • 水平方向尽可能占据较大的空间;

  • 垂直方向包裹内容;
    WechatIMG49.jpeg

  • 如果水平方向也希望包裹内容,那么设置mainAxisSize = min;
    WechatIMG48.jpeg

return RaisedButton(onPressed: (){},color: Colors.red,child: Row(mainAxisSize: MainAxisSize.min,children: [Icon(Icons.favorite),Text("收藏"),],),);

2.2. mainAxisAlignment

元素在Row主轴上的布局方式,它是一个枚举类型:


  • start :主轴开始的位置挨个摆放元素;
  • end :主轴结束的位置挨个摆放元素;
  • center :主轴的中心点对齐;
  • spaceBetween: 左右两边的间距为0,其他元素之间平分间距;
  • spaceAround:左右两边的间距是其他元素的间距的一半;
  • spaceEvenly:间距平分;

class _YZHomeContentState extends State {@overrideWidget build(BuildContext context) {return Row(children: [Container(width: 80, height: 60, color: Colors.red,),Container(width: 120, height: 100, color: Colors.orange,),Container(width: 90, height: 80, color: Colors.blue,),Container(width: 50, height: 50, color: Colors.green,),],mainAxisAlignment: MainAxisAlignment.spaceEvenly,);}
}

WechatIMG50.jpeg


2.3. CrossAxisAlignment

crossAxisAlignment: CrossAxisAlignment.end,

元素在Row交叉轴上的布局方式


  • start:交叉轴的起始位置对齐;
  • end:交叉轴的结束位置对齐(垂直方向是包裹内容的);
  • center:中心点对齐(默认值)
  • baseLine:基线对齐;(必须有文本才有效果)
  • stretch: 先将Row占据交叉轴尽可能大的空间,再将所有的子Widget拉伸到最大;



2.4. Expanded

空间分配:拉伸或收缩;


  • 如果控件之间有间隔:拉伸;
  • 如果控件组合宽度超过了屏幕,则压缩;
    WechatIMG943.jpeg
    如上图,间隔等分,如果想把所有间隔分配给第一个;

return Row(children: [Expanded(child: Container(width: 80, height: 60, color: Colors.red,),),Container(width: 120, height: 100, color: Colors.orange,),Container(width: 90, height: 80, color: Colors.blue,),Container(width: 50, height: 50, color: Colors.green,),],mainAxisAlignment: MainAxisAlignment.spaceEvenly,crossAxisAlignment: CrossAxisAlignment.end,);}
}

效果:


  • 第一个控件宽度做了拉伸;
    WechatIMG942.jpeg

2.4.1 flex作用

Expanded(flex: 1,child: Container(width: 80, height: 60, color: Colors.red,),),
Expanded(flex: 2,child: Container(width: 40, height: 60, color: Colors.green,),),

剩余空间分配比例: 当有多个Expanded时,


  • 如果flex相等,则拉伸的宽度相同;
  • 如果flex不等,按比例拉伸,如上面flex:2控件的宽度拉伸为flex: 1宽度的2倍,原来的width数值不再起作用。



3. Column组件

同Row;




4. Stack组件

在开发中,我们多个组件很有可能需要重叠显示,比如在一张图片上显示文字或者一个按钮等。在Flutter中我们需要使用层叠布局Stack。


4.1 Stack介绍

Stack的大小默认是包裹内容的.


  • alignment:从什么位置开始排布所有的子Widget;
  • fit: expand 将子元素拉伸到尽可能大;
  • overflow:超出部分如何处理;

Stack({Key key,this.alignment = AlignmentDirectional.topStart,this.textDirection,this.fit = StackFit.loose,this.overflow = Overflow.clip,this.clipBehavior = Clip.hardEdge,List children = const [],})

4.2 示例


class _YZHomeContentState extends State {@overrideWidget build(BuildContext context) {return Stack(alignment: AlignmentDirectional.bottomCenter,overflow: Overflow.visible,children: [Image.asset("assets/images/image_01.png",),Container(width: 150, height: 50, color: Colors.red,),// Positioned( //文字在Stack内部相对布局调整// right: 10,// bottom: 20,// child:Text("这是图片上的文字"),// ),],);}
}

WechatIMG51.jpeg


class _YZHomeContentState extends State {bool _isFavor = false;@overrideWidget build(BuildContext context) {return Stack(children: [Image.asset("assets/images/image_02.jpeg?s=#34;,width: MediaQuery.of(context).size.width,),Positioned(left: 0,right: 0,bottom: 0,child: Container(padding: EdgeInsets.all(8),color: Color.fromARGB(10, 0, 0, 0),child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [Text("这是图片上的文字描述", style: TextStyle(fontSize: 15, color: Colors.red),),IconButton(icon: Icon(Icons.favorite,color: _isFavor ? Colors.red : Colors.white,),onPressed: () {setState(() {_isFavor = !_isFavor;});}),],),),),],);}
}

WechatIMG52.jpeg


推荐阅读
  • android图片浏览器(二)——实现显示图片的标题
    上一篇文章http:blog.csdn.netbadboy1110articledetails6879236只是单纯的显示一个图片,虽然我改进了,但是在 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • linux qt打开常用文件格式,设置Linux Qt文件默认打开方式为QtCreator
    Linux自定义文件打开方式也可参照文本抱歉,本文前段时间写的ubuntu下的Qt工程文件默认打开方式是不好用的,因为其他的文本文件也会受到影响,强迫症患者,每次打开Qt工程都是先 ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • HTC EVO 4G+手机存储(SD卡)中各个文件夹功能说明(转载)
      HTCRider/X515E/EVO4G+手机存储(SD卡)中各个文件夹功能说明  HTCRider/X515E/EVO4G+  1、.android_s ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 详解Android  自定义UI模板设计_由浅入深
    学习安卓已有一些日子,前段时间整理了不少笔记,但是发现笔记不变分享与携带。今天开始整理博客,全当是与大家分享交流与自身学习理解的过程吧。结合最近在做的一个新闻类app及学习中的问题,一点一点整理一下, ... [详细]
  • Flutter第六章(BottomNavigationBar ,AppBar,TabBar ,TabController 以及案例)
    版权声明:本文为作者原创书籍。转载请注明作者和出处,未经授权,严禁私自转载,侵权必究!!!情感语录:如果你想得到从未拥有过的东西,那么你必须去做从未做过的事 ... [详细]
author-avatar
深碍是碍u不是爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有