Я создал флаттер-виджет, который перемещает круг с помощью акселерометра. Это очень тормозит, так как мне приходится использовать 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, но движение круга работает как надо.
flutter run --release
или простоflutter build
- person Julio Henrique Bitencourt   schedule 12.06.2019build
? почему порог0.02
? и почему вы вызываете_animeController.forward();
внутри него (и с постоянной продолжительностью 2 секунды)? - person pskink   schedule 12.06.2019