Dart 如何在颤振中沿Z轴旋转图像?

Dart 如何在颤振中沿Z轴旋转图像?,dart,flutter,flutter-layout,flutter-animation,Dart,Flutter,Flutter Layout,Flutter Animation,我在颤振代码中使用Transform小部件来旋转屏幕 Offset _offset = Offset.zero; return new Transform( transform: Matrix4.identity() ..setEntry(3, 2, 0.001) ..rotateX(0.01 * _offset.dy) ..rotateY(-0.01 * _offset.dx)

我在颤振代码中使用Transform小部件来旋转屏幕

Offset _offset = Offset.zero;

return new Transform(
        transform: Matrix4.identity()
               ..setEntry(3, 2, 0.001)
               ..rotateX(0.01 * _offset.dy)
               ..rotateY(-0.01 * _offset.dx)
               ..rotateZ(- 0.01 * _offset.),
        alignment: FractionalOffset.center,
        child: new Scaffold(
          appBar: AppBar(
            title: Text("The 3D Matrix"),
          ),
          body: GestureDetector(
              onPanUpdate: (details) => setState(() => _offset += details.delta),
              onDoubleTap: () => setState(() => _offset = Offset.zero),
              child: Content())
        ),);
现在我想要的是以一定的速度沿z轴旋转小部件,几秒钟后将其速度降低到零

可能我需要使用动画控制器。我们如何才能达到这种状态


现在我实现了这一点:

只需在页面小部件中添加一个
AnimationController
。然后将
变换
包装到
动画生成器中

需要启动动画时,请调用
animationController.forward()

类MyHome扩展StatefulWidget{
@凌驾
_MyHomeState createState()=>\u MyHomeState();
}
类_MyHomeState使用SingleTickerProviderStateMixin扩展状态{
动画控制器;
@凌驾
void initState(){
animationController=新的animationController(
持续时间:常数持续时间(秒数:2),
vsync:这个,,
);
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回新的AnimatedBuilder(
动画:animationController,
生成器:(上下文,子对象){
返回新变换(
转换:Matrix4.identity()
..设置条目(3,2,0.001)
..rotateZ(animationController.value*45.0),
孩子:孩子,
);
},
儿童:新脚手架(
appBar:appBar(
标题:文本(“3D矩阵”),
),
正文:新中心(
孩子:新升起的按钮(
onPressed:()=>animationController.forward(),
子项:新文本(“开始动画”),
),
),
),
);
}
}

我只想在我的手势小部件中添加另一个旋转功能,如onTap或onLongPressed,并保持所有功能不变。你刚刚展示了我的旋转功能。你还需要什么?我想要我的GestureDetector的两个功能相同,还有一些如何添加onTap()=>的另一个属性,该属性启动活动旋转,然后慢慢返回其原始状态。你能解释一下setEntry的功能吗?
class MyHome extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}

class _MyHomeState extends State<MyHome> with SingleTickerProviderStateMixin {
  AnimationController animationController;

  @override
  void initState() {
    animationController = new AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    );
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new AnimatedBuilder(
      animation: animationController,
      builder: (context, child) {
        return new Transform(
          transform: Matrix4.identity()
            ..setEntry(3, 2, 0.001)
            ..rotateZ(animationController.value * 45.0),
          child: child,
        );
      },
      child: new Scaffold(
        appBar: AppBar(
          title: Text("The 3D Matrix"),
        ),
        body: new Center(
          child: new RaisedButton(
            onPressed: () => animationController.forward(),
            child: new Text("Start anim"),
          ),
        ),
      ),
    );
  }
}