gpt4 book ai didi

animation - Flutter 代码创建滞后动画。这里有什么问题吗?

转载 作者:行者123 更新时间:2023-12-02 11:29:25 25 4
gpt4 key购买 nike

我创建了一个 flutter 小部件,可以用加速度计移动圆圈。它非常滞后,因为当手机移动时我必须使用 setState 来更改圆圈的位置。有没有其他方法可以创建这个?

我在这里使用了 AnimatedBuilder,但不确定当设备平滑移动时它如何改变圆圈的位置。

class _AnimationWidgetState extends State<AnimationWidget>
with TickerProviderStateMixin {
AnimationController _animeController;
Animation _anime;
double x = 0.0, y = 0.0;
@override
void initState() {
super.initState();
_animeController =
AnimationController(vsync: this, duration: const Duration(seconds: 2));
_anime = Tween(begin: 0.5, end: 0.5).animate(
CurvedAnimation(parent: _animeController, curve: Curves.ease));
accelerometerEvents.listen((AccelerometerEvent event) {
var a = ((event.x * 100).round() / 100).clamp(-1.0, 1.0) * -1;
var b = ((event.y * 100).round() / 100).clamp(-1.0, 1.0);
if ((x - a).abs() > 0.02 || (y - b).abs() > 0.02) {
setState(() {
x = a; y = b;
});
}
});
}

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

@override
Widget build(BuildContext context) {
_animeController.forward();
final double width = MediaQuery.of(context).size.width;
final double height = MediaQuery.of(context).size.height;
return AnimatedBuilder(
animation: _animeController,
builder: (context, child) {
return Scaffold(
body: Transform(
transform: Matrix4.translationValues(
_anime.value * width * x, _anime.value * height * y, 0.0),
child: Center(
child: CircleAvatar(
radius: 15.0,
backgroundColor: Colors.green,
),
),
),
);
},
);
}
}

动画一点也不流畅。这是因为我必须使用 setState,但圆圈的移动正在按预期工作。

最佳答案

使用 AnimationController 的全部目的是监听其事件 - 这就是 AnimatedBuilder 所做的并相应地重建其子树。

我将在这里发布我对代码中需要更改的内容的总体建议。

<小时/>

删除 setState - 这就是使整个布局重新重建的原因,即滞后。

还触发 _animeController 监听器,即您的情况下的 AnimatedBuilder - 重建自身。

accelerometerEvents.listen((AccelerometerEvent event) {
var a = ((event.x * 100).round() / 100).clamp(-1.0, 1.0) * -1;
var b = ((event.y * 100).round() / 100).clamp(-1.0, 1.0);
if ((x - a).abs() > 0.02 || (y - b).abs() > 0.02) {
x = a; y = b;
_animeController.value = _animeController.value; // Trigger controller's listeners
}
});
<小时/>

initState中启动动画,而不是在build中。这是在您的情况下产生滞后的第二件事。 .forward 触发小部件的重建,从而导致无限循环。

@override
void initState() {
super.initState();
_animeController.forward();
}
<小时/>

使用 AnimatedBuilderchild 属性可以节省每次重建头像 block 时的资源。另外,我不确定 Scaffold 在这里的用途 - 如果不需要,我们将其删除。

AnimatedBuilder(
animation: _animeController,
builder: (context, child) => Transform(
transform: Matrix4.translationValues(_anime.value * width * x, _anime.value * height * y, 0.0),
child: child,
),
child: Center(
child: CircleAvatar(
radius: 15.0,
backgroundColor: Colors.green,
),
),
);
<小时/>

关注Official Animations Tutorial掌握 Flutter 动画。

请告诉我这是否有帮助。

关于animation - Flutter 代码创建滞后动画。这里有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56562091/

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