Flutter控件——容器控件:变换Transform

Posted wzj_what_why_how

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter控件——容器控件:变换Transform相关的知识,希望对你有一定的参考价值。

变换(Transform)

Transform可以在其子组件绘制时对其应用一些矩阵变换来实现一些特效。Matrix4是一个4D矩阵,通过它我们可以实现各种矩阵操作。

basic.dart

class Transform extends SingleChildRenderObjectWidget 
  /// Creates a widget that transforms its child.
  ///
  /// The [transform] argument must not be null.
  const Transform(
    Key? key,
    required this.transform,
    this.origin,
    this.alignment,
    this.transformHitTests = true,
    this.filterQuality,
    Widget? child,
  )

eg:

Container(
  color: Colors.black,
  child: Transform(
    alignment: Alignment.topRight, //相对于坐标系原点的对齐方式
    transform: Matrix4.skewY(0.3), //沿Y轴倾斜0.3弧度
    child: Container(
      padding: const EdgeInsets.all(8.0),
      color: Colors.deepOrange,
      child: const Text('Apartment for rent!'),
    ),
  ),
)

平移 Transform.translate

Transform.translate接收一个offset参数,可以在绘制时沿x、y轴对子组件平移指定的距离。

DecoratedBox(
  decoration:BoxDecoration(color: Colors.red),
  //默认原点为左上角,左移20像素,向上平移5像素
  child: Transform.translate(
    offset: Offset(-20.0, -5.0),
    child: Text("Hello world"),
  ),
)

旋转 Transform.rotate

Transform.rotate可以对子组件进行旋转变换,如:

   DecoratedBox(
     decoration:BoxDecoration(color: Colors.red),
     child: Transform.rotate(
       //旋转90度
       angle:math.pi/2 ,
       child: Text("Hello world"),
     ),
   )

ps: 要使用math.pi需先进行导包:import ‘dart:math’ as math;

缩放 Transform.scale

Transform.scale可以对子组件进行缩小或放大,如:

   DecoratedBox(
     decoration:BoxDecoration(color: Colors.red),
     child: Transform.scale(
       scale: 1.5, //放大到1.5倍
       child: Text("Hello world")
     )
   );

注意事项

  • Transform的变换是应用在绘制阶段,而并不是应用在布局(layout)阶段,所以无论对子组件应用何种变化,其占用空间的大小和在屏幕上的位置都是固定不变的,因为这些是在布局阶段就确定的。

RotatedBox

RotatedBox和Transform.rotate功能相似,它们都可以对子组件进行旋转变换,但是有一点不同:RotatedBox的变换是在layout阶段,会影响在子组件的位置和大小。
eg:

   Row(
     mainAxisAlignment: MainAxisAlignment.center,
     children: <Widget>[
       DecoratedBox(
         decoration: BoxDecoration(color: Colors.red),
         //将Transform.rotate换成RotatedBox
         child: RotatedBox(
           quarterTurns: 1, //旋转90度(1/4圈)
           child: Text("Hello world"),
         ),
       ),
       Text("你好", style: TextStyle(color: Colors.green, fontSize: 18.0),)
     ],
   ),
  • 由于RotatedBox是作用于layout阶段,所以子组件会旋转90度(而不只是绘制的内容),decoration会作用到子组件所占用的实际空间上,所以最终就是上图的效果。

以上是关于Flutter控件——容器控件:变换Transform的主要内容,如果未能解决你的问题,请参考以下文章

Flutter控件——容器控件:变换Transform

Flutter 滑动、缩放控件

Flutter控件——容器控件:装饰容器 DecoratedBox

Flutter控件——容器控件:装饰容器 DecoratedBox

Flutter控件——容器控件:Scaffold

Flutter控件——容器控件:Scaffold