其实我不久前也问过类似的问题:如何在两个偏移之间添加控制点(贝塞尔曲线)?
但现在我们有了空安全,所以我修改了那里的代码,并为您做了一个快速演示。
完整源代码:
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(home: MyHome()));
}
class MyHome extends StatefulWidget {
@override
State<MyHome> createState() => _MyHomeState();
}
class _MyHomeState extends State<MyHome> {
Offset _end = Offset(300, 300);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Demo'),
),
body: Stack(
children: [
TweenAnimationBuilder(
tween: BezierTween(
begin: Offset(0, 0),
control: Offset(0, 300),
end: _end,
),
duration: Duration(seconds: 1),
builder: (BuildContext context, Offset value, Widget? child) {
return Positioned(
left: value.dx,
top: value.dy,
child: FlutterLogo(),
);
},
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_end = Offset.zero;
});
},
),
);
}
}
class BezierTween extends Tween<Offset> {
final Offset begin;
final Offset end;
final Offset control;
BezierTween({required this.begin, required this.end, required this.control})
: super(begin: begin, end: end);
@override
Offset lerp(double t) {
final t1 = 1 - t;
return begin * t1 * t1 + control * 2 * t1 * t + end * t * t;
}
}