Flutter Widget(2):单节点Widget

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxl517116279/article/details/88985041

Padding

Padding作为基础控件,功能非常单一,给子节点设置padding属性。Flutter中并没有单独的Margin控件,在Container中有margin属性,实质上也是由Padding实现的。

 const Padding({
    Key key,
    @required this.padding,
    Widget child,
  }) : assert(padding != null),
       super(key: key, child: child);
  • padding:padding的类型为EdgeInsetsGeometry,EdgeInsetsGeometry是EdgeInsets以及EdgeInsetsDirectional的基类,一般都是使用EdgeInsets。

使用场景
如果在单一的间距场景,使用Padding比Container的成本要小一些,毕竟Container里面包含了多个widget。Padding能够实现的,Container都能够实现,只不过Container更加的复杂。

Align

设置child的对齐方式,例如居中、居左居右等,并根据child尺寸调节自身尺寸。Container中的align属性,也是使用Align去实现的。它能够实现的功能,Container都能实现。

 Align(
      alignment: Alignment.bottomRight,
      widthFactor: 5.0,
      heightFactor: 5.0,
      child: new Text("Align"),
)
  • alignment:对齐方式
  • widthFactor:宽度因子,如果设置的话,Align的宽度就是child的宽度乘以这个值,不能为负数。
  • heightFactor:高度因子,如果设置的话,Align的高度就是child的高度乘以这个值,不能为负数。

Center

Center继承自Align,只是将alignment设置为Alignment.center,其他属性和逻辑都与Align完全一样

class Center extends Align {
  /// Creates a widget that centers its child.
  const Center({ Key key, double widthFactor, double heightFactor, Widget child })
    : super(key: key, widthFactor: widthFactor, heightFactor: heightFactor, child: child);
}
        body: Container(
          child: Center(
            widthFactor: 5.0,
            heightFactor: 5.0,
            child: new Text("Align"),
          ),
        ),

FittedBox

FittedBox在自己的尺寸范围内缩放并且调整child的位置,与ImageView的ScaleType类似

  • 如果外部有约束的话,按照外部约束调整自身尺寸,然后缩放调整child,按照指定的条件进行布局;
  • 如果没有外部约束条件,则跟child尺寸一致,指定的缩放以及位置属性将不起作用。
          new Container(
            color: Colors.amberAccent,
            width: 300.0,
            height: 300.0,
            child: new FittedBox(
              fit: BoxFit.fill,
              alignment: Alignment.topLeft,
              child: new Container(
                color: Colors.red,
                child: new Text("FittedBox"),
              ),
            ),
          )

AspectRatio

AspectRatiode 的作用是调整child的宽高比,AspectRatio首先会在布局限制条件允许的范围内尽可能的扩展,widget的高度是由宽度和比率决定的,类似于BoxFit中的contain,按照固定比率去尽量占满区域。

  • aspectRatio:宽与高的比例
          new Container(
            width: 360.0,
            child: new AspectRatio(
              aspectRatio:1.5,
              child: new Container(
                color: Colors.grey,
              ),
            ),
          )

ConstrainedBox

给child添加额外的约束条件,例如设置最小宽高,尽可能的占用区域等等

const BoxConstraints({
    this.minWidth = 0.0,
    this.maxWidth = double.infinity,
    this.minHeight = 0.0,
    this.maxHeight = double.infinity //最大值,尽可能占用区域
  });

UnconstrainedBox

不添加任何约束条件到child上,让child按照其原始的尺寸渲染。

BaseLine

根据child的baseline,来调整child的位置,比如让多个大小不一的Widget在同一水平线上

  • 如果child有baseline,则根据child的baseline属性,调整child的位置;
  • 如果child没有baseline,则根据child的bottom,来调整child的位置。
  • baseline:baseline数值,必须要有,从顶部算。
  • baselineType:bseline类型,也是必须要有的,目前有两种类型:
    • alphabetic:对齐字符底部的水平线;
    • ideographic:对齐表意字符的水平线。
          new Row(
            children: <Widget>[
              new Baseline(
                baseline: 100.0,
                baselineType: TextBaseline.alphabetic,
                child: new Text(
                  'TjTjTj',
                  style: new TextStyle(
                    fontSize: 20.0,
                    textBaseline: TextBaseline.alphabetic,
                  ),
                ),
              ),
              new Baseline(
                baseline:100.0,
                baselineType: TextBaseline.alphabetic,
                child: new Container(
                  width: 30.0,
                  height: 30.0,
                  color: Colors.grey,
                ),
              ),
              new Baseline(
                baseline: 100.0,
                baselineType: TextBaseline.alphabetic,
                child: new Text(
                  'RyRyRy',
                  style: new TextStyle(
                    fontSize: 35.0,
                    textBaseline: TextBaseline.alphabetic,
                  ),
                ),
              ),
            ],
          )

FractionallySizedBox

FractionallySizedBox控件会根据现有空间,来调整child的尺寸,child就算设置了具体的尺寸数值,也不起作用。

  • alignment:对齐方式,不能为null。
  • widthFactor:宽度因子
  • heightFactor:高度因子

当设置了具体的宽高因子,具体的宽高则根据现有空间宽高 * 因子,有可能会超出父控件的范围,当宽高因子大于1的时候;当没有设置宽高因子,则填满可用区域;

          new Container(
            color: Colors.blue,
            height: 200.0,
            width: 200.0,
            child: new FractionallySizedBox(
              alignment: Alignment.bottomLeft,
              widthFactor: 1.5,
              heightFactor: 0.5,
              child: new Container(
                color: Colors.red,
              ),
            ),
          )

IntrinsicHeight 和 IntrinsicWidth

这个控件的作用,是将可能高度宽度不受限制的child,调整到一个合适并且合理的尺寸,会存在效率问题,能别使用就尽量别使用。

LimitedBox

限定的最大高度或宽度,默认值是double.infinity,不能为负数。

    LimitedBox(
      maxWidth: 150.0,
      child: Container(
        color: Colors.blue,
        width: 250.0,
      ),
    ),

Offstage

一个布局widget,可以控制其子widget的显示和隐藏

  • 当offstage为true,当前控件不会被绘制在屏幕上,不会响应点击事件,也不会占用空间;
  • 当offstage为false,当前控件则跟平常用的控件一样渲染绘制
  new Offstage(
      offstage: false,
      child: Container(color: Colors.blue, height: 100.0),
    ),

OverflowBox

OverflowBox这个控件,允许child超出parent的范围显示

  • alignment:对齐方式。
  • minWidth:允许child的最小宽度。如果child宽度小于这个值,则按照最小宽度进行显示。
  • maxWidth:允许child的最大宽度。如果child宽度大于这个值,则按照最大宽度进行展示。
  • minHeight:允许child的最小高度。如果child高度小于这个值,则按照最小高度进行显示。
  • maxHeight:允许child的最大高度。如果child高度大于这个值,则按照最大高度进行展示。
Container(
            color: Colors.green,
            width: 100.0,
            height: 100.0,
            padding: const EdgeInsets.all(5.0),
            child: OverflowBox(
              alignment: Alignment.topLeft,
              maxWidth: 200.0,
              maxHeight: 400.0,
              child: Container(
                color: Color(0x33FFFFFF),
                width: 300.0,
                height: 300.0,
              ),
            ),
          )),

SizedBox

一个特定大小的盒子。这个widget强制它的孩子有一个特定的宽度和高度。如果宽度或高度为NULL,则此widget将调整自身大小以匹配该维度中的孩子的大小。

  • child不为null时,如果设置了宽高,则会强制把child尺寸调到此宽高;如果没有设置宽高,则会根据child尺寸进行调整;
  • child为null时,如果设置了宽高,则自身尺寸调整到此宽高值,如果没设置,则尺寸为0;
        Container(
            color: Colors.green,
            padding: const EdgeInsets.all(5.0),
            child: SizedBox(
              width: 200.0,
              height: 200.0,
              child: Container(
                color: Colors.red,
                width: 100.0,
                height: 300.0,
              ),
            ),
          )

SizedOverflowBox

一个具有特定大小的小部件,但将其原始约束传递给其子级,这可能会溢出。

  • 尺寸部分。通过将自身的固定尺寸,传递给child,来达到控制child尺寸的目的;
  • 超出部分。可以突破父节点尺寸的限制,超出部分也可以被渲染显示,与OverflowBox类似。

Transform

在绘制子widget之前应用转换的widget,平移、旋转、缩放都可以使用的到。如果只是单纯的进行变换的话,用Transform比用Container效率会更高。

const Transform({
  Key key,
  @required this.transform,
  this.origin,
  this.alignment,
  this.transformHitTests = true,
  Widget child,
})
  • transform:一个4x4的矩阵。
  • origin:旋转点,相对于左上角顶点的偏移。默认旋转点是左上角顶点。
  • alignment:相对于坐标系原点的对齐方式
  • transformHitTests:点击区域是否也做相应的改变。

另外三种构造函数

  • Transform.rotate:可以对子widget进行旋转变换
  • Transform.translate:接收一个offset参数,可以在绘制时沿x、y轴对子widget平移指定的距离。
  • Transform.scale:可以对子Widget进行缩小或放大

CustomSingleChildLayout

一个自定义的拥有单个子widget的布局widget,我们自定义一些单节点布局控件的时候,可以考虑使用它。

CustomSingleChildLayout提供了一个控制child布局的delegate,这个delegate可以控制这些因素:

  • 可以控制child的布局constraints;
  • 可以控制child的位置;
  • 在parent的尺寸不依赖于child的情况下,可以决定parent的尺寸。

猜你喜欢

转载自blog.csdn.net/hxl517116279/article/details/88985041