61 lines
1.7 KiB
Dart
61 lines
1.7 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'dart:math' as math;
|
|
|
|
class LeafPatternPainter extends CustomPainter {
|
|
@override
|
|
void paint(Canvas canvas, Size size) {
|
|
final random = math.Random(42); // Fixed seed for consistent pattern
|
|
final leafCount = (size.width * size.height / 15000).round().clamp(10, 50);
|
|
|
|
for (int i = 0; i < leafCount; i++) {
|
|
final x = random.nextDouble() * size.width;
|
|
final y = random.nextDouble() * size.height;
|
|
final rotation = random.nextDouble() * 2 * math.pi;
|
|
final scale = random.nextDouble() * 0.5 + 0.5; // 0.5 to 1.0
|
|
final opacity = (random.nextDouble() * 0.15 + 0.05).clamp(0.05, 0.2); // 0.05 to 0.2
|
|
|
|
canvas.save();
|
|
canvas.translate(x, y);
|
|
canvas.rotate(rotation);
|
|
canvas.scale(scale);
|
|
|
|
_drawLeaf(canvas, opacity);
|
|
|
|
canvas.restore();
|
|
}
|
|
}
|
|
|
|
void _drawLeaf(Canvas canvas, double opacity) {
|
|
final paint = Paint()
|
|
..color = Colors.green.shade800.withOpacity(opacity)
|
|
..style = PaintingStyle.fill
|
|
..strokeWidth = 1.0;
|
|
|
|
final path = Path();
|
|
|
|
// Leaf shape
|
|
path.moveTo(0, 0);
|
|
path.cubicTo(5, -10, 10, -15, 20, -20);
|
|
path.cubicTo(10, -10, 5, -5, 0, 0);
|
|
path.cubicTo(-5, -5, -10, -10, -20, -20);
|
|
path.cubicTo(-10, -15, -5, -10, 0, 0);
|
|
path.close();
|
|
|
|
// Draw leaf
|
|
canvas.drawPath(path, paint);
|
|
|
|
// Draw vein
|
|
paint.color = Colors.green.shade800.withOpacity(opacity * 1.5);
|
|
paint.style = PaintingStyle.stroke;
|
|
paint.strokeWidth = 0.5;
|
|
|
|
final veinPath = Path();
|
|
veinPath.moveTo(0, 0);
|
|
veinPath.lineTo(0, -15);
|
|
|
|
canvas.drawPath(veinPath, paint);
|
|
}
|
|
|
|
@override
|
|
bool shouldRepaint(LeafPatternPainter oldDelegate) => false;
|
|
} |