gpt4 book ai didi

animation - flutter 动画插值

转载 作者:行者123 更新时间:2023-12-04 11:46:06 24 4
gpt4 key购买 nike

我正在尝试基于一个动画来旋转一个小部件(这不是问题的一部分,因为它通过构造函数参数处理旋转本身),该动画在前一个旋转位置之间插入一个使用插件函数获得的新位置。该函数的值( FlutterCompass.events.listen )定期异步更新,并且每次都会重建 Tween objetc 以表示小部件位置的更新。这是我的代码:

import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';
import 'package:flutter_compass/flutter_compass.dart';
import 'package:compass_test/compass.dart';

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

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin{
double _direction;
double _angle = 0.0;
Animation<double> _animation;
AnimationController _animationController;
Tween<double> _tween;

@override
void initState() {
super.initState();
_animationController =
AnimationController(duration: Duration(milliseconds: 400), vsync: this);
_tween = Tween<double>(begin: 0.0, end: 0.0);
_animation = _tween.animate(_animationController)
..addListener(() {
setState(() {
_angle =_animationController.value;
});
});
_direction = 0;

FlutterCompass.events.listen((double direction) {
print(_animationController.status);
if(_direction !=direction){
_tween = Tween<double>(
begin: _direction,
end: direction);
_animationController.reset();
_tween.animate(_animationController);
_animationController.forward();
}
_direction = direction;
});
}

@override
void dispose(){
_animationController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Column(
children: <Widget>[
Center(
child: Container(
margin: EdgeInsets.only(top: 100),
child: Compass(height: 300, width: 300, angleToNorth: _angle)
)
)
],
)
),
);
}
}

但是,正如我已经能够通过一些调试看到的那样,从 _animationController.value 返回的值仅在 0.0 到 1.0 之间变化,这不是我认为应该发生的:我预计它们会与之前的值 _direction 不同。到新 direction值(value)。我怎样才能做到这一点?

提前致谢

最佳答案

这就是动画 Controller 应该如何工作。使用一些额外的线条,您甚至可以为值从 0.0 到 1.0 的变化添加一条曲线。但这些值总是从 0.0 到 1.0。所以你可以做的是像这样更新 _angles 值 _angle = degree of angle * _animationController.value .所以让我们说你的角度是 50 度。所以当你开始你的动画时,动画 Controller 的值将从 0.0 开始,乘以 50 给你 0。随着动画 Controller 的值从 0.0 移动到 1.0,_angle 的值也会改变,最后给你 50 作为 1.0 * 50 是 50!但是正如您提到的,您只想旋转小部件。因此,如果您想再次运行动画,您可以使用 double 类型的补间动画构建器来代替这个,并更新结束值;动画将从之前的值继续。

关于animation - flutter 动画插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55013691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com