【问题标题】:How to rotate a Widget around a focal point using gestures in Flutter?如何使用 Flutter 中的手势围绕焦点旋转 Widget?
【发布时间】:2019-06-04 14:40:16
【问题描述】:

在 Flutter 中,我可以使用 Transform Widget 来旋转 Widget。但是,旋转是围绕 Transform 小部件属性中指定的原点进行的,而不是围绕当前焦点。

我尝试通过平移到焦点、旋转然后平移回来来修改矩阵。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: new TransformContainer(),
      ),
    );
  }
}

class TransformContainer extends StatefulWidget {
  const TransformContainer({
    Key key,
  }) : super(key: key);

  @override
  TransformContainerState createState() {
    return new TransformContainerState();
  }
}

class TransformContainerState extends State<TransformContainer> {
  Matrix4 matrix = Matrix4.identity();
  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        GestureDetector(
          onTapDown: (details) {
            matrix.translate(-details.globalPosition.dx, -details.globalPosition.dy);
            matrix.rotateZ(0.174533);
            matrix.translate(details.globalPosition.dx, details.globalPosition.dy);
            setState(() {});
          },
          onDoubleTap: () {
            setState(() {
              matrix = Matrix4.identity();
            });
          },
          child: Transform(
            transform: matrix,
            alignment: FractionalOffset.topLeft,
            child: Container(
              color: Colors.black54,
              child: Center(
                child: Container(
                  width: 320,
                  height: 320,
                  color: Colors.redAccent,
                ),
              ),
            ),
          ),
        ),
        Positioned(
          top: 64.0,
          right: 64.0,
          child: Container(
            color: Colors.pinkAccent,
            child: IconButton(
              icon: Icon(Icons.refresh),
              iconSize: 72.0,
              color: Colors.white,
              onPressed: () {
                setState(() {
                  matrix = Matrix4.identity();
                });
              },
            ),
          ),
        ),
      ],
    );
  }
}

当您运行代码并点击屏幕时,Widget 会围绕原点旋转。如何让它围绕点击位置旋转?

【问题讨论】:

  • 试过leftTranslate?
  • 是的,但它不会改变任何东西。
  • 首先用正值调用matrix.translate(,旋转并用负值调用matrix.translate( - 这有点帮助,但仍然有问题: - 认为罪魁祸首在globalPosition - 你需要一些"localPosition"
  • 这里的全局位置很好,因为Widget是全屏的。但是,是的,这有问题。
  • 你弄明白了吗?

标签: dart flutter


【解决方案1】:

在对小部件应用旋转之前将变换原点设置为center

alignment: FractionalOffset.center

【讨论】:

  • 将对齐设置为中心将使小部件围绕中心旋转 - 而不是围绕焦点旋转。
  • 当您说“焦点”时,我将其理解为“中心”。焦点是什么意思?
猜你喜欢
  • 2013-09-17
  • 2012-08-15
  • 2021-08-22
  • 2020-08-31
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多