Flutter 第一个动画

作者: 狼性刀锋 | 来源:发表于2019-07-31 16:05 被阅读1次

    3D映射

    最基础的动画就是移动、放大、旋转这些,而要做到这些就要使用: Matrix4 进行映射,如下:

        Container(
          color: Colors.brown,  
          width: 100,
          height: 100,
          transform: Matrix4.identity()..rotateZ(pi / 4.0),
          
        );
    

    将容器绕Z轴旋转90度,但是很快就发现,旋转的位置不对, 以左上角的为原点进行旋转,而我们想要的是以中心点作为原点, 于是有了下面这段:

    Transform(
              transform: Matrix4.identity()..rotateZ(pi / 4.0),
              alignment: Alignment.center,
              child: new Container(
                color: Colors.brown,           
                width: 100,
                height: 100,
            
            ),
    

    在Flutter中需要使用Transform, 进行transform操作,它可以更改旋转的原点位置

    第一个动画

    class _MyHomePageState extends State<MyHomePage>
        with SingleTickerProviderStateMixin {
      AnimationController _animationController;
    
      final String title;
    
      _MyHomePageState(this.title);
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        // 2 秒内 , value 从 0.0 - 1.0 线性渐变
        _animationController = AnimationController(
            vsync: this, duration: Duration(milliseconds: 2000));
    
        // 添加监听器
        // 一定要监听数值的变化,手动设置setState, 否则无法刷新视图
        _animationController.addListener(() {
          // 当动画值发生变化时调用setState
          this.setState(() {
          });
        });
    
        // 执行一次
        // _animationController.forward();
    
       // 重复执行
        _animationController.repeat();
      }
    
      @override
      void dispose() {
        // TODO: implement dispose
        super.dispose();
        _animationController.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
    
        return new Scaffold(
          appBar: new AppBar(title: new Text(title)),
          body: new Container(
            color: Colors.green,
            alignment: Alignment.center,
            child: Transform(
              transform: Matrix4.identity()..rotateZ(pi / 4.0),
              alignment: Alignment.center,
              child: new Container(
                //   color: Colors.brown,
                alignment: Alignment.center,
                width: 200 * _animationController.value, // 根据value, 计算宽度
                height: 200,
                decoration: BoxDecoration(
                    border: Border.all(color: Colors.blue, width: 5),
                    borderRadius: BorderRadius.all(//圆角
                        Radius.circular(30.0))),
              ),
            ),
          ),
        );
      }
    }
    
    
    

    相关文章

      网友评论

        本文标题:Flutter 第一个动画

        本文链接:https://www.haomeiwen.com/subject/ecjtdctx.html