137 lines
4.1 KiB
Dart
137 lines
4.1 KiB
Dart
import 'dart:io';
|
|
import 'dart:ui' as ui;
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
|
|
// Script untuk generate icon PNG dari Flutter widget
|
|
Future<void> generateIcon() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
const size = 512;
|
|
final recorder = ui.PictureRecorder();
|
|
final canvas = Canvas(recorder);
|
|
|
|
// Background gradient
|
|
final backgroundPaint =
|
|
Paint()
|
|
..shader = const LinearGradient(
|
|
colors: [Color(0xFF1976D2), Color(0xFF2196F3)],
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
).createShader(Rect.fromLTWH(0, 0, size.toDouble(), size.toDouble()));
|
|
|
|
// Draw rounded background
|
|
canvas.drawRRect(
|
|
RRect.fromLTRBR(
|
|
0,
|
|
0,
|
|
size.toDouble(),
|
|
size.toDouble(),
|
|
const Radius.circular(80),
|
|
),
|
|
backgroundPaint,
|
|
);
|
|
|
|
// White paint for elements
|
|
final whitePaint =
|
|
Paint()
|
|
..color = Colors.white
|
|
..style = PaintingStyle.fill;
|
|
|
|
final linePaint =
|
|
Paint()
|
|
..color = Colors.white
|
|
..strokeWidth = 8
|
|
..strokeCap = StrokeCap.round;
|
|
|
|
// Draw API connection lines
|
|
// Left side
|
|
canvas.drawLine(const Offset(80, 200), const Offset(180, 200), linePaint);
|
|
canvas.drawLine(const Offset(80, 256), const Offset(180, 256), linePaint);
|
|
canvas.drawLine(const Offset(80, 312), const Offset(180, 312), linePaint);
|
|
|
|
// Right side
|
|
canvas.drawLine(const Offset(332, 200), const Offset(432, 200), linePaint);
|
|
canvas.drawLine(const Offset(332, 256), const Offset(432, 256), linePaint);
|
|
canvas.drawLine(const Offset(332, 312), const Offset(432, 312), linePaint);
|
|
|
|
// Central connections
|
|
canvas.drawLine(const Offset(200, 200), const Offset(220, 200), linePaint);
|
|
canvas.drawLine(const Offset(200, 256), const Offset(220, 256), linePaint);
|
|
canvas.drawLine(const Offset(200, 312), const Offset(220, 312), linePaint);
|
|
|
|
canvas.drawLine(const Offset(292, 200), const Offset(312, 200), linePaint);
|
|
canvas.drawLine(const Offset(292, 256), const Offset(312, 256), linePaint);
|
|
canvas.drawLine(const Offset(292, 312), const Offset(312, 312), linePaint);
|
|
|
|
// Draw API nodes (circles)
|
|
canvas.drawCircle(const Offset(60, 200), 20, whitePaint);
|
|
canvas.drawCircle(const Offset(60, 256), 20, whitePaint);
|
|
canvas.drawCircle(const Offset(60, 312), 20, whitePaint);
|
|
|
|
canvas.drawCircle(const Offset(452, 200), 20, whitePaint);
|
|
canvas.drawCircle(const Offset(452, 256), 20, whitePaint);
|
|
canvas.drawCircle(const Offset(452, 312), 20, whitePaint);
|
|
|
|
// Central processing unit
|
|
canvas.drawRRect(
|
|
RRect.fromLTRBR(220, 180, 292, 312, const Radius.circular(12)),
|
|
whitePaint,
|
|
);
|
|
|
|
// Fire detection symbol
|
|
final firePaint =
|
|
Paint()
|
|
..shader = const LinearGradient(
|
|
colors: [Color(0xFFFF5722), Color(0xFFF44336)],
|
|
begin: Alignment.topLeft,
|
|
end: Alignment.bottomRight,
|
|
).createShader(const Rect.fromLTWH(240, 190, 32, 60));
|
|
|
|
// Simple fire shape
|
|
final firePath =
|
|
Path()
|
|
..moveTo(256, 190)
|
|
..quadraticBezierTo(240, 200, 245, 220)
|
|
..quadraticBezierTo(250, 235, 256, 240)
|
|
..quadraticBezierTo(262, 235, 267, 220)
|
|
..quadraticBezierTo(272, 200, 256, 190);
|
|
|
|
canvas.drawPath(firePath, firePaint);
|
|
|
|
// Status indicator
|
|
final statusPaint = Paint()..color = const Color(0xFF4CAF50);
|
|
canvas.drawCircle(const Offset(400, 112), 24, statusPaint);
|
|
|
|
// Check mark
|
|
final checkPaint =
|
|
Paint()
|
|
..color = Colors.white
|
|
..strokeWidth = 4
|
|
..strokeCap = StrokeCap.round
|
|
..style = PaintingStyle.stroke;
|
|
|
|
final checkPath =
|
|
Path()
|
|
..moveTo(388, 112)
|
|
..lineTo(396, 120)
|
|
..lineTo(412, 104);
|
|
|
|
canvas.drawPath(checkPath, checkPaint);
|
|
|
|
// Create image
|
|
final picture = recorder.endRecording();
|
|
final image = await picture.toImage(size, size);
|
|
final byteData = await image.toByteData(format: ui.ImageByteFormat.png);
|
|
|
|
if (byteData != null) {
|
|
final file = File('assets/icons/app_icon.png');
|
|
await file.writeAsBytes(byteData.buffer.asUint8List());
|
|
print('Icon generated successfully: ${file.path}');
|
|
}
|
|
}
|
|
|
|
void main() async {
|
|
await generateIcon();
|
|
}
|