Flutter行列基础教程(线性布局)
线性布局是指子组件在水平或垂直方向上的排列方式。 Flutter 中线性布局是通过 对于线性布局,有主轴和垂直轴。如果布局是沿水平方向(如: 效果如下: 看图说话:Row
和 Column
实现的,类似于 Android 中的 LinearLayout 控件。
等于所有子组件在主轴方向上占用的最大空间。 ? xisSize.min,那么这个属性就没用了,因为子组件的宽度等于Row
和 Column
均继承自 Flex
(弹性布局)。我们稍后会详细解释Flex
。 。 主轴和垂直轴
Row
),则主轴显示水平方向,垂直轴则显示垂直方向;如果布局是垂直方向(如:Column
),则主轴表示垂直方向,垂直轴表示水平方向。线性布局中,有两个定义对齐方式的枚举类MainAxisAlignment
和CrossAxisAlignment
,分别代表主轴和垂直轴对齐方式。 Row
Row
可以在水平方向上排列子组件,定义如下: Row({
...
TextDirection textDirection,
MainAxisSize mainAxisSize = MainAxisSize.max,
MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
VerticalDirection verticalDirection = VerticalDirection.down,
CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
TextBaseline textBaseline,
List<Widget> children = const <Widget>[],
})
复制代码
textDirection
:表示子组件在水平方向左侧或右侧或右侧的布局顺序。 left ),默认为系统当前Locale环境的文本方向(例如中文和英文从左到右,阿拉伯语从右到左)。 ?子部件实际占用多少主轴空间,Row
的宽度始终等于主轴方向的最大宽度;而MainAxisSize.min
表示占用一点主轴空间,例如,当子组件Row
不占用主轴的剩余空间时。 RowRow
的宽度。仅当 mainAxisSize
的值为 MainAxisSize.max
、MainAxisSize 起始方向 文本方向
对齐时,此属性才有用,例如,当文字方向
取值 TextDirection.ltr
,然后MainAxisAlignment.start left Alignment.start。 文本方向值
为当TextDirection.rtl时,MainAxisAlignment.start
表示右对齐。而MainAxisAlignment.end
和MainAxisAlignment.start
正好相反,对齐。 。我们可以这样理解:
表示左对齐,所以最终的显示结果就是图中第三行的样子; textDirection
是参考系MainAxisAlignment
。 Major Axis Alignment 枚举值 Destination start 将子项放置在主轴的起点 middle♸ middle 位于中间♸ 结束 将children放置在主轴的末端 spaceAround 将主轴方向的空白区域均分,使得children之间的空白区域相同,但是第一个和第一个的空白区域最后一个子项是 1/2 spaceBetween 移动主轴方向向上 均匀划分空出区域,使得子级之间的空出区域相同,并且第一个和最后一个子级接近第一个和最后一个孩子,没有间隙。 空间相等 沿主轴方向划分空白区域,使子级之间的空白区域相同,包括头子级和尾级子级 垂直方向
:显示子级的方向垂直轴 行
。默认为VerticalDirection.down
,意思是从上到下。crossAxisAlignment
:表示子组件在垂直轴方向的对齐方式。 Row
的高度等于子组件中最高子元素的高度。值与MainAxisAlignment
相同(包含三个值start、end、center
),不同的是❀的参考系 为 VerticalDirection
,即 VerticalDirection
当值为 垂直方向时取。 CrossAxisAlignment.start
表示顶部对齐,VerticalDirection
采用VerticalDirection的值。当向上
时, CrossAxisAlignment.start
显示底部对齐;而 CrossAxisAlignment.end
和 CrossAxisAlignment.start
则恰恰相反。 CrossAxisAlignment 枚举值 使用 start 子项显示在交叉轴上的起点 center♺显示在轴的中心 center♺❀ end 孩子在交叉轴的末端显示 基线 在交叉轴的方向上,这样孩子们的基线与 拉伸 对齐,这样孩子们就可以填充横轴方向 textBaseline
:线基线。 child
:子组件的排列。示例
Column(
//测试Row对齐方式,排除Column默认居中对齐的干扰
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Hello World"),
Text("I am Zane")
],
),
Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Hello World"),
Text("I am Zane")
],
),
Row(
textDirection: TextDirection.rtl,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Text("Hello World"),
Text("I am Zane")
],
),
Row(
verticalDirection: VerticalDirection.up,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("Hello World", style: TextStyle(fontSize: 30.0),),
Text("I am Zane"),
],
),
],
),
复制代码
线,中间对齐很简单;
第二行
,因为mainAxisSize
的值为SizeMain。Main。
行数
等于两个文字宽度
相加,所以对齐没有意义,所以会从左到右显示两个文字
; Row
设置为 TextDirection.rtl
,因此子组件将从左到左显示,并且在 ♻ 中的中,这是按正确顺序排列的。 sAlignment.end
行
测试 是垂直轴的对齐。因为两个子文字
的字体不同,所以高度也不同。我们定义verticalDirection
的值为VerticalDirection.up
,即从下到上排列,此时s♻cross❀的值为CrossAxis对齐.start
表示较低对齐。 Column
Column
可以垂直排列子组件。参数与Row
相同。不同的是子组件布局方向是垂直的。主轴线和垂直轴与Row
正好相反。读者可以类比 Row
来理解,我们举个例子:
import 'package:flutter/material.dart';
class CenterColumnRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text("Hi"),
Text("World"),
],
);
}
}
复制代码
操作的效果如下:
看图说:♹确定mainAxisSize
来自 Column
,使用默认值 MainAxisSize。
将在垂直方向上占用尽可能多的空间,在本例中为屏幕的高度。
crossAxisAlignment
定义为CrossAxisAlignment.center
,那么子组件就在
中 垂直轴方向(当前水平方向)将居中。注意水平方向对齐是有限的,空间实际宽度的总宽度被Column
占据,实际宽度取决于子组件中宽度最大的组件。在本例中,Column
有两个子组件,而显示“World”的Text
具有最大宽度,因此❀❀ Text("World")的宽度
,所以中心对齐后,Text("Hi")
会显示在中间 Text("World")
其实都是Row
和Column
只会在主轴方向和最大垂直轴的长度上占据尽可能多的空间。子元素。
如果我们想让本例中的两个文本控件在整个屏幕的中心对齐,我们有两种方法:
- 定义
Column
的宽度为屏幕;您可以通过ConstrainedBox
或SizedBox
强制其更改宽度限制,例如:ConstrainedBox( constraints: BoxConstraints(minWidth: double.infinity), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ Text("Hi"), Text("World") ], ), ), SizedBox( width: double.infinity, child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ Text("Hi"), Text("World") ], ), ), 复制代码
set ♶
双无穷大
,你可以使宽度占据尽可能多的空间。 - 使用组件
中心
,例如:Center( child: Column( children: <Widget>[ Text("Hi"), Text("World") ], ), ), 复制代码
特殊情况
如果 运行效果如下: 如果想要内部 外部 效果如下: 作者:zane行位于行
,或列
列
放在里面,那么只有最外面的Row
或才是最外面的空间,并且尽可能多的
Row
或Column所占据的空间是合适的尺寸。以
Column
为例: Container(
color: Colors.blue,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.max, //有效,外层Colum高度为整个屏幕
children: <Widget>[
Container(
color: Colors.white,
child: Column(
mainAxisSize: MainAxisSize.max, //无效,内层Colum高度为实际高度
children: <Widget>[
Text("Hello world"),
Text("I am Zane")
],
),
),
],
),
),
),
复制代码
Column
,可以使用扩展
组件:Container(
color: Colors.blue,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.max, //有效,外层Colum高度为整个屏幕
children: <Widget>[
Expanded( //使用Expanded
child: Container(
color: Colors.white,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max, //有效,内层Colum高度占满外部Column
children: <Widget>[
Text("Hello world"),
Text("I am Zane")
],
),
),
),
],
),
),
),
复制代码
链接:https://juej583a3/5b63f3a/5b63f3a/5b63f3a/5b63f3a/5b63f3a 来源:Nugget
权利版权归属给作者。商业转载请联系作者获取授权。非商业转载请注明出处。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。