Flutter编程 —— Widget_Container
Container
是一个Widget
容器,容器里面可以放置任意的Widget
子组件,可以是一个文本组件Text
,也可以是一个图片组件Image
,甚至是一个和自己一样的Container
。Container
的子组件用child
属性来指定。
属性
Container
提供了很多属性,大体上包含大小
、位置
和装饰
。
属性 | 解释 | 类型 |
---|---|---|
alignment | 对齐方式 | AlignmentGeometry |
padding | 内边距 | EdgeInsetsGeometry |
color | 背景色 | Color |
decoration | 背景装饰器 | Decoration |
foregroundDecoration | 前景装饰器 | Decoration |
width | 宽度 | double |
height | 高度 | double |
constraints | 约束 | BoxConstraints |
margin | 外边距 | EdgeInsetsGeometry |
child | 子Widget | Widget |
transform | 转换 | Matrix4 |
width,height
指定Container
的宽高,不指定的话默认充满父Widget
,double
类型。下图是一个不指定宽高的Container
。
body: Center(
child: Container(
color: Colors.blue,
),
),
效果图:
可以看到,Container
完全占满了整个body
区域。下面来看看指定Container
的宽高属性是什么效果
body: Center(
child: Container(
width: 300,
height: 300,
color: Colors.blue,
),
),
效果图:
指定了宽高属性之后,Container
就会按照指定的宽高来绘制了。
color
在上面宽高属性例子中就使用到了color
属性,是一个Color
类型的值,声明Color
的方式通常也有几种方式:
-
Flutter
预定义的一些常用颜色在Colors
类中,如Colors.blue
; -
Color.fromARGB(a, r, g, b)
-
a
:alpha,透明度,0~255的整型值,0代表完全透明,255代表完全不透明,128代表半透明 -
r
:red,红色通道,0~255的整型值,255代表红色 -
g
:green,绿色通道,0~255的整型值,255代表绿色 -
b
:blue,蓝色通道,0~255的整型值,255代表蓝色
Color.fromARGB(255, 255, 0, 0)
表示红色。 -
-
Color.fromRGBO(r, g, b, o)
-
r
:red,红色通道,0~255的整型值,255代表红色 -
g
:green,绿色通道,0~255的整型值,255代表绿色 -
b
:blue,蓝色通道,0~255的整型值,255代表蓝色 -
o
:opacity,不透明度,0.0~1.0的浮点数,1.0代表完全不透明
Color.fromRGBO(255, 0, 0, 1.0)
表示红色。 -
-
Color
传入十六进制颜色值,传入的十六进制颜色值也是按照ARGB
的格式。Color(0xFFFF0000)
表示红色-
0x
:16进制前缀标识 -
FF
:透明度,FF
为255,表示完全不透明 -
FF
:红色通道,FF为255,表示红色 -
0000
:绿色通道+蓝色通道,与红色通道的FF
叠加表示红色
-
alignment
子Widget
在父Widget
中的对齐方式。
body: Center(
child: Container(
width: 200,
height: 200,
color: Colors.blue,
alignment: XXX, // 指定下方的Container的对齐方式
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
)
Flutter
已经内置了一些常用的对齐方式:
-
topLeft
-
topCenter
-
topRight
-
centerLeft
-
center
-
centerRight
-
bottomLeft
-
bottomCenter
-
bottomRight
topLeft | topCenter | topRight |
---|---|---|
centerLeft | center | centerRight |
bottomLeft | bottomCenter | bottomRight |
从上表中的效果图中可以看出,Flutter
预置的对齐方式上下方向分为上
中
下
,左右方向分为左
中
右
,将一个Widget
按照了6条线进行分割。
那么如果想到达到如下效果应该怎么做呢?
橙色圆形在点(0,0)
和点(0,1)
的中间,和上图表格中的效果图对比发现,Flutter
内置的9个对齐方式已经满足不了需求了,但是Flutter
为我们提供了更*定制的一种方式,通过Alignment
类构造函数的方式传入x
坐标和y
坐标的距离分数(distance fraction)
,距离分数
在范围0 ~ 1
之间。
body: Center(
child: Container(
width: 200,
height: 200,
color: Colors.blue,
alignment: Alignment(0, 0.5), // 指定下方的Container的对齐方式
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
)
其实查看源码后可以发现,Flutter
预置的9种对齐方式也是通过这种构造函数的方式来定义的。
padding
设置Widget
与其子Widget
内边界的距离。
body: Container(
width: 200,
height: 200,
color: Colors.blue,
padding: EdgeInsets.all(30),
alignment: Alignment.topLeft,
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
红色矩形上下左右和蓝色矩形的上下左右距离为30,因为红色矩形比较小,因此看不出右边和下边的内边距。把内层Container
的宽高去掉,再看看效果:
body: Container(
width: 200,
height: 200,
color: Colors.blue,
padding: EdgeInsets.all(30),
alignment: Alignment.topLeft,
child: Container(
color: Colors.red,
),
),
可以看到,红色矩形和蓝色矩形边界距离都是30。
-
EdgeInsets.zero
:与上下左右没有边距; -
EdgeInsets.all(double value)
:统一设置上下左右边距; -
EdgeInsets.only({double left, double top, double right, double bottom})
:分开设置上下左右边距,可单独设置,如果全部设置成一样的值,则等价于EdgeInsets.all(double value)
; -
EdgeInsets.fromLTRB(double left, double top, double right, double bottom)
:必须传入4个参数,依次表示上
下
左
右
,与EdgeInsets.only
不同的是,EdgeInsets.only
是可选命名函数,可单独设置,而EdgeInsets.fromLTRB
不是可选命名函数,必须要一一对应传入每个参数; -
EdgeInsets.symmetric({double vertical, double horizontal})
:设置水平内边距和垂直内边距,水平内边距则是设置左内边距和右内边距,垂直内边距则是设置上内边距和下内边距。其本质上和上面几种设置方式没有什么区别,都是通过设置其left
top
right
bottom
这几个属性来达到目的。
margin
设置Widget
其父Widget
外边界的距离。
body: Container(
width: 200,
height: 200,
color: Colors.blue,
margin: EdgeInsets.all(30),
alignment: Alignment.topLeft,
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
通过与padding
中的第一张图中的效果对比可以发现,设置margin
后,蓝色矩形不再是和红色矩形有边距了,而是和整个body
区域的边距,因为该边距在该蓝色Widget
的外侧,所以叫外边距。从图中同样看不出上下左右的边距效果,我们把外层Container
的宽高去掉,再看看效果:
body: Container(
color: Colors.blue,
margin: EdgeInsets.all(30),
alignment: Alignment.topLeft,
child: Container(
width: 50,
height: 50,
color: Colors.red,
),
),
可以看到,蓝色矩形的外边界距离都是30。
设置外边距的方式和内边距的方式完全一样。
-
EdgeInsets.zero
:与上下左右没有边距; -
EdgeInsets.all(double value)
:统一设置上下左右边距; -
EdgeInsets.only({double left, double top, double right, double bottom})
:分开设置上下左右边距,可单独设置,如果全部设置成一样的值,则等价于EdgeInsets.all(double value)
; -
EdgeInsets.fromLTRB(double left, double top, double right, double bottom)
:必须传入4个参数,依次表示上
下
左
右
,与EdgeInsets.only
不同的是,EdgeInsets.only
是可选命名函数,可单独设置,而EdgeInsets.fromLTRB
不是可选命名函数,必须要一一对应传入每个参数; -
EdgeInsets.symmetric({double vertical, double horizontal})
:设置水平内边距和垂直内边距,水平内边距则是设置左内边距和右内边距,垂直内边距则是设置上内边距和下内边距。其本质上和上面几种设置方式没有什么区别,都是通过设置其left
top
right
bottom
这几个属性来达到目的。
child
设置一个Widget
包含的另一个Widget
,比如上面例子中蓝色矩形Widget
包含的红色矩形Widget
,可以是任意Widget
。
decoration、foregroundDecoration
见 Flutter编程 —— BoxDecoration
transform
见 Flutter编程 —— transform