如何围绕指定的锚点在 2D 中旋转容器小部件?

How can I rotate a Container widget in 2D around a specified anchor point?

我想对 Container 小部件(包含少量其他小部件)执行非常简单的 2D 旋转。此小部件将围绕中心的单个固定点旋转,没有变形。

我尝试将 transform 属性 与 Matrix4.rotationZ 一起使用,这有点管用——但锚点在 左上角 角,不在中心。有没有一种简单的方法来指定该锚点?

此外,是否有不需要 Matrix4 的更简单的 2D 旋转此小部件的方法?

var container = new Container (
  child: new Stack (
    children: [
      new Image.asset ( // background photo
        "assets/texture.jpg",
        fit: ImageFit.cover,
      ),
      new Center (
        child: new Container (
          child: new Text (
            "Lorem ipsum",
            style: new TextStyle(
              color: Colors.white,
              fontSize: 42.0,
              fontWeight: FontWeight.w900
            )
          ),
          decoration: new BoxDecoration (
            backgroundColor: Colors.black,
          ),
          padding: new EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 16.0),
          transform: new Matrix4.rotationZ(0.174533), // rotate -10 deg
        ),
      ),
    ],
  ),
  width: 400.0,
  height: 200.0,
);

在旋转前后应用平移(到支点和从支点开始)。

您可以自己创建一个小部件来执行此操作,从而同时解决您的其他问题(隐藏 Matrix4)。

根据 Ian 的建议,我尝试了以下方法。它似乎有效,至少在我的有限测试中是这样。

容器嵌套在 Transform widget 中。使用 alignment 可以相对地调整 transform-origin,即在中间、左上角等

var container = new Container (
  child: new Stack (
    children: [
      new Image.asset ( // background photo
        "assets/texture.jpg",
        fit: ImageFit.cover,
      ),
      new Center (
        child: new Transform (
          child: new Container (
            child: new Text (
              "Lorem ipsum",
              style: new TextStyle(
                color: Colors.white,
                fontSize: 42.0,
                fontWeight: FontWeight.w900,
              )
            ),
            decoration: new BoxDecoration (
              backgroundColor: Colors.black,
            ),
            padding: new EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 16.0),              
          ),
          alignment: FractionalOffset.center, // set transform origin
          transform: new Matrix4.rotationZ(0.174533), // rotate -10 deg
        ),
      ),
    ],
  ),
  width: 400.0,
  height: 200.0,
);

对于像我一样想做应用的人,只需使用Transform and Gesturedetector。记住不要一起使用 Draggable 和 Gesturedetector,因为你只能拖放但不能缩放 widget :)).

参考: A Deep Dive Into Transform Widgets in Flutter

barbswatanabe

:

             Transform.rotate(
                  alignment: FractionalOffset.center,
                  angle: state.listStickerModel[index].angle,
                  child: Transform(
                    alignment: FractionalOffset.center,
                    transform: new Matrix4.diagonal3(vector.Vector3(
                        state.listStickerModel[index].zoom,
                        state.listStickerModel[index].zoom,
                        state.listStickerModel[index].zoom)),
                    child: GestureDetector(
                      onScaleStart: (detail) {
                        _editPhotoBloc.add(UpdateSticker(
                          index: index,
                          offset: detail.focalPoint,
                          previousZoom: state.listStickerModel[index].zoom,
                        ));
                      },
                      onScaleUpdate: (detail) {
                        _editPhotoBloc.add(UpdateSticker(
                            index: index,
                            offset: Offset(detail.localFocalPoint.dx,
                                detail.focalPoint.dy),
                            angle: detail.rotation,
                            zoom:
                                state.listStickerModel[index].previousZoom *
                                    detail.scale));
                      },
                      child: Container(
                        alignment: Alignment.center,
                        child: SvgPicture.asset(
                            state.listStickerModel[index].src),
                      ),
                    ),
                  ),
                ),

您可以使用 RotatedBox Widget 来旋转任何小部件:

RotatedBox(
    quarterTurns: 3,
    child: Container(
        color:Colors.red
    ),
),

在 flutter 2.2 中

使用变换:

Transform(
    transform: Matrix4.rotationZ(...),
    alignment: FractionalOffset.center,
    child: Container(...)

或在容器中设置transformAlignment值:

Container(
    ...
    transform: Matrix4.rotationZ(...),
    transformAlignment: Alignment.center,
)