Анимация отдельного элемента CustomPaint во Flutter
я пытаюсь освоить анимации и CustomPaint
Как я могу анимировать какую то отдельную часть моего CustomPaint класса, например, улыбку смайлика
CustomPaint class
import 'package:flutter/material.dart';
import 'dart:math' as Math;
class SmileyPainter extends CustomPainter {
var smilePaints;
@override
void paint(Canvas canvas, Size size) {
final radius = Math.min(size.width, size.height) / 4;
final center = Offset(size.width / 2, size.height / 2);
// Body
final paint = Paint()..color = Colors.yellow;
canvas.drawCircle(center, radius, paint);
// Mouth
drawMouth() {
final smilePaint = Paint()
..style = PaintingStyle.fill
..strokeWidth = 10;
canvas.drawArc(Rect.fromCircle(center: center, radius: radius / 2), 0,
Math.pi, false, smilePaint);
}
smilePaints = drawMouth();
// Eyes
canvas.drawCircle(
Offset(center.dx - radius / 2, center.dy - radius / 2), 10, Paint());
canvas.drawCircle(
Offset(center.dx + radius / 2, center.dy - radius / 2), 10, Paint());
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => true;
}
main
import 'package:flutter/material.dart';
import 'smileWidget.dart';
import 'dart:math' as math;
void main() {
runApp(SmileWidgetPage());
}
class SmileWidgetPage extends StatefulWidget {
@override
_SmileWidgetPageState createState() => _SmileWidgetPageState();
}
class _SmileWidgetPageState extends State<SmileWidgetPage>
with TickerProviderStateMixin {
Animation<double> animation;
AnimationController controller;
void initState() {
super.initState();
controller =
AnimationController(vsync: this, duration: Duration(seconds: 1));
Tween<double> rotationTween = Tween(begin: -math.pi, end: math.pi / 2);
animation = rotationTween.animate(controller)
..addListener(() {
setState(() {});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Practice 4'),
),
body: Container(
color: Colors.grey,
height: 800,
width: 500,
child: TweenAnimationBuilder(
duration: Duration(seconds: 2),
tween: Tween<double>(begin: 0, end: 2 * math.pi),
builder: (_, double angle, __) {
return Transform.rotate(
angle: angle,
child: CustomPaint(
painter: SmileyPainter(),
));
},
))));
}
}