// 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 'dart:ui' as ui; import 'package:flutter/material.dart'; Future<ui.Image> loadImage(String asset) async { final ui.ImmutableBuffer buffer = await ui.ImmutableBuffer.fromAsset(asset); final ui.Codec codec = await PaintingBinding.instance.instantiateImageCodecWithSize(buffer); final ui.FrameInfo frameInfo = await codec.getNextFrame(); return frameInfo.image; } class DrawAtlasPage extends StatefulWidget { const DrawAtlasPage({super.key}); @override State<DrawAtlasPage> createState() => _DrawAtlasPageState(); } class _DrawAtlasPageState extends State<DrawAtlasPage> with SingleTickerProviderStateMixin { late final AnimationController controller; double tick = 0.0; ui.Image? image; @override void initState() { super.initState(); loadImage('packages/flutter_gallery_assets/food/butternut_squash_soup.png').then((ui.Image pending) { setState(() { image = pending; }); }); controller = AnimationController(vsync: this, duration: const Duration(hours: 1)); controller.addListener(() { setState(() { tick += 1; }); }); controller.forward(from: 0); } @override void dispose() { controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { if (image == null) { return const Placeholder(); } return CustomPaint( size: const Size(500, 500), painter: VerticesPainter(tick, image!), child: Container(), ); } } class VerticesPainter extends CustomPainter { VerticesPainter(this.tick, this.image); final double tick; final ui.Image image; @override void paint(Canvas canvas, Size size) { canvas.translate(0, tick); canvas.drawAtlas( image, <RSTransform>[RSTransform.fromComponents(rotation: 0, scale: 1, anchorX: 0, anchorY: 0, translateX: 0, translateY: 0)], <Rect>[Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble())], <Color>[Colors.red], BlendMode.plus, null, Paint() ); canvas.drawAtlas( image, <RSTransform>[RSTransform.fromComponents(rotation: 0, scale: 1, anchorX: 0, anchorY: 0, translateX: 250, translateY: 0)], <Rect>[Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble())], <Color>[Colors.green], BlendMode.plus, null, Paint() ); canvas.drawAtlas( image, <RSTransform>[RSTransform.fromComponents(rotation: 0, scale: 1, anchorX: 0, anchorY: 0, translateX: 0, translateY: 250)], <Rect>[Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble())], <Color>[Colors.blue], BlendMode.plus, null, Paint() ); canvas.drawAtlas( image, <RSTransform>[RSTransform.fromComponents(rotation: 0, scale: 1, anchorX: 0, anchorY: 0, translateX: 250, translateY: 250)], <Rect>[Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble())], <Color>[Colors.yellow], BlendMode.plus, null, Paint() ); } @override bool shouldRepaint(covariant CustomPainter oldDelegate) { return true; } }