如何围绕指定的锚点在 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
:
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,
)
我想对 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
:
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,
)