Advertisement
Hitesh_jadhav

flutter_animation

Jun 17th, 2022
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1.  
  2. import 'dart:async';
  3. import 'dart:math';
  4. import 'dart:ui' as ui;
  5.  
  6. import 'package:flutter/material.dart';
  7.  
  8. void main() => runApp(
  9. MaterialApp(
  10. home: Container(color: Colors.grey[900], child: App()),
  11. debugShowMaterialGrid: false,
  12. ),
  13. );
  14.  
  15. final size = ui.window.physicalSize / ui.window.devicePixelRatio;
  16.  
  17. const frequency = Duration(milliseconds: 50);
  18.  
  19. class Circle {
  20. final Offset offset;
  21. final double radius;
  22. final Color color;
  23.  
  24. const Circle({required this.offset, this.color = Colors.white, this.radius = 10});
  25. }
  26.  
  27. class App extends StatefulWidget {
  28. @override
  29. _AppState createState() => _AppState();
  30. }
  31.  
  32. class _AppState extends State<App> {
  33. late Timer timer;
  34.  
  35. final points = <Offset>[Offset.zero];
  36. final circles = <Circle>[];
  37.  
  38. Offset force = Offset(1, 1);
  39.  
  40. HSLColor hslColor = HSLColor.fromColor(Colors.red);
  41.  
  42. final StreamController<List<Circle>> _circleStreamer =
  43. StreamController<List<Circle>>.broadcast();
  44.  
  45. Stream<List<Circle>> get _circle$ => _circleStreamer.stream;
  46.  
  47. Offset get randomPoint => size.topLeft(Offset.zero) * Random().nextDouble();
  48.  
  49. Color get color => hslColor.toColor();
  50.  
  51. @override
  52. void initState() {
  53. timer = Timer.periodic(
  54. frequency,
  55. (t) {
  56. if (circles.isEmpty)
  57. _circleStreamer.add(
  58. circles..add(Circle(offset: randomPoint, radius: 10, color: color)),
  59. );
  60. int count = 0;
  61. while (count < 19) {
  62. final dx = circles.last.offset.dx;
  63. final dy = circles.last.offset.dy;
  64.  
  65. if ((dx + force.dx > size.width) || (dx + force.dx < 0))
  66. force = Offset(-force.dx, force.dy);
  67. if ((dy + force.dy > size.height) || (dy + force.dy < 0))
  68. force = Offset(force.dx, -force.dy);
  69.  
  70. final newPoint = circles.last.offset + force;
  71. final newCircle = Circle(
  72. offset: newPoint,
  73. radius: 80 + (30 * sin(circles.length / 49)),
  74. color: hslColor.toColor(),
  75. );
  76. hslColor = hslColor.withHue((hslColor.hue + 0.1) % 360);
  77. _circleStreamer.add(circles..add(newCircle));
  78. count++;
  79. }
  80. },
  81. );
  82. super.initState();
  83. }
  84.  
  85. @override
  86. void dispose() {
  87. timer.cancel();
  88. _circleStreamer.close();
  89. super.dispose();
  90. }
  91.  
  92. @override
  93. Widget build(BuildContext context) => Stack(
  94. children: [
  95. StreamBuilder<List<Circle>>(
  96. initialData: [],
  97. stream: _circle$.map((event) => event.length > 100
  98. ? event.getRange(event.length - 100, event.length).toList()
  99. : event),
  100. builder: (context, snapshot) {
  101. final circles = snapshot.data;
  102. return CustomPaint(
  103. size: size,
  104. painter: CirclePainter(circles: circles),
  105. );
  106. },
  107. ),
  108. ],
  109. );
  110. }
  111.  
  112. class CirclePainter extends CustomPainter {
  113. List<Circle> circles;
  114.  
  115. CirclePainter({required this.circles});
  116.  
  117. @override
  118. void paint(Canvas canvas, Size size) {
  119. for (int i = 0; i < circles.length - 1; i++) {
  120. final c = circles[i];
  121. final paint = Paint()
  122. ..color = c.color
  123. ..shader = ui.Gradient.radial(
  124. c.offset - Offset(0, c.radius),
  125. c.radius,
  126. /*c.offset + Offset(0, c.radius / 8),*/
  127. [
  128. Color(0x053ffffff),
  129. Colors.transparent,
  130. ],
  131. );
  132.  
  133. final light = Paint()
  134. ..shader = ui.Gradient.linear(
  135. c.offset,
  136. c.offset + Offset(0, c.radius),
  137. [
  138. c.color.withOpacity(0.85),
  139. Colors.black,
  140. ],
  141. );
  142.  
  143. canvas.drawCircle(c.offset, c.radius, light);
  144. canvas.drawCircle(c.offset, c.radius, paint);
  145. }
  146. }
  147.  
  148. @override
  149. bool shouldRepaint(CustomPainter oldDelegate) => true;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement