import
'package:flutter/material.dart'
;
void
main() {
runApp(
MyApp(),
);
}
class
MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return
MaterialApp(
theme: ThemeData(
primarySwatch: Colors.green,
),
debugShowCheckedModeBanner:
false
,
home: Scaffold(
appBar: AppBar(
title: Text(
'Line Animation Example'
),
),
body: LineAnimationView(),
),
);
}
}
class
LinePainter extends CustomPainter {
final
double
animationValue;
LinePainter(
this
.animationValue);
@override
void
paint(Canvas canvas, Size size) {
final paint = Paint()
..color = Colors.green
..style = PaintingStyle.stroke
..strokeWidth = 5.0;
final
double
startX = 0;
final
double
endX = size.width;
final
double
y = size.height / 2;
final
double
currentX = startX + (endX - startX) * animationValue;
canvas.drawLine(Offset(startX, y), Offset(currentX, y), paint);
}
@override
bool
shouldRepaint(covariant CustomPainter oldDelegate) {
return
true
;
}
}
class
LineAnimationView extends StatefulWidget {
@override
_LineAnimationViewState createState() => _LineAnimationViewState();
}
class
_LineAnimationViewState extends State<LineAnimationView>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
@override
void
initState() {
super.initState();
_controller = AnimationController(
vsync:
this
,
duration: Duration(seconds: 2),
)..repeat(reverse:
true
);
}
@override
Widget build(BuildContext context) {
return
AnimatedBuilder(
animation: _controller,
builder: (context, child) {
return
CustomPaint(
size: Size(
MediaQuery.of(context).size.width,
100.0,
),
painter: LinePainter(
_controller.value),
);
},
);
}
@override
void
dispose() {
_controller.dispose();
super.dispose();
}
}