| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/material.dart'; |
| |
| class _MultiplyPainter extends CustomPainter { |
| _MultiplyPainter(this._color); |
| |
| final Color _color; |
| |
| @override |
| void paint(Canvas canvas, Size size) { |
| const int xDenominator = 2; |
| const int yDenominator = 10; |
| final double width = size.width / xDenominator; |
| final double height = size.height / yDenominator; |
| |
| for (int y = 0; y < yDenominator; y++) { |
| for (int x = 0; x < xDenominator; x++) { |
| final Rect rect = Offset(x * width, y * height) & Size(width, height); |
| final Paint basePaint = Paint() |
| ..color = Color.fromARGB( |
| (((x + 1) * width) / size.width * 255.0).floor(), |
| (((y + 1) * height) / size.height * 255.0).floor(), |
| 255, |
| 127); |
| canvas.drawRect(rect, basePaint); |
| |
| final Paint multiplyPaint = Paint() |
| ..color = _color |
| ..blendMode = BlendMode.multiply; |
| canvas.drawRect(rect, multiplyPaint); |
| } |
| } |
| } |
| |
| @override |
| bool shouldRepaint(CustomPainter oldDelegate) { |
| return true; |
| } |
| } |
| |
| class AnimatedAdvancedBlend extends StatefulWidget { |
| const AnimatedAdvancedBlend({super.key}); |
| |
| @override |
| State<AnimatedAdvancedBlend> createState() => _AnimatedAdvancedBlendState(); |
| } |
| |
| class _AnimatedAdvancedBlendState extends State<AnimatedAdvancedBlend> with SingleTickerProviderStateMixin { |
| late final AnimationController controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 5000)); |
| late final Animation<double> animation = controller.drive(Tween<double>(begin: 0.0, end: 1.0)); |
| Color _color = const Color.fromARGB(255, 255, 0, 255); |
| |
| @override |
| void initState() { |
| super.initState(); |
| controller.repeat(); |
| animation.addListener(() { |
| setState(() { |
| _color = Color.fromARGB((animation.value * 255).floor(), 255, 0, 255); |
| }); |
| }); |
| } |
| |
| @override |
| void dispose() { |
| controller.dispose(); |
| super.dispose(); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return MaterialApp( |
| home: Scaffold( |
| body: CustomPaint( |
| painter: _MultiplyPainter(_color), |
| child: Container(), |
| ), |
| )); |
| } |
| } |