168 lines
4.2 KiB
Dart
168 lines
4.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'dart:ui' as ui;
|
|
import 'dart:io';
|
|
|
|
class IconGenerator {
|
|
static Future<void> generateAppIcons() async {
|
|
// Sizes untuk berbagai platform
|
|
final sizes = [
|
|
16, 32, 48, 64, 128, 256, 512, 1024, // Berbagai ukuran
|
|
];
|
|
|
|
for (final size in sizes) {
|
|
await _generateIcon(size);
|
|
}
|
|
}
|
|
|
|
static Future<void> _generateIcon(int size) async {
|
|
// Create a recorder to record drawing commands
|
|
final recorder = ui.PictureRecorder();
|
|
final canvas = Canvas(recorder);
|
|
|
|
// Background
|
|
final backgroundPaint =
|
|
Paint()
|
|
..color = Colors.blue
|
|
..style = PaintingStyle.fill;
|
|
|
|
canvas.drawRRect(
|
|
RRect.fromLTRBR(
|
|
0,
|
|
0,
|
|
size.toDouble(),
|
|
size.toDouble(),
|
|
Radius.circular(size * 0.1),
|
|
),
|
|
backgroundPaint,
|
|
);
|
|
|
|
// API Icon shape
|
|
final iconPaint =
|
|
Paint()
|
|
..color = Colors.white
|
|
..style = PaintingStyle.fill;
|
|
|
|
final iconSize = size * 0.6;
|
|
final iconOffset = size * 0.2;
|
|
|
|
// Draw simple API icon (circles and lines)
|
|
// Center circle
|
|
canvas.drawCircle(
|
|
Offset(size * 0.5, size * 0.5),
|
|
iconSize * 0.15,
|
|
iconPaint,
|
|
);
|
|
|
|
// Side circles
|
|
canvas.drawCircle(
|
|
Offset(iconOffset + iconSize * 0.2, size * 0.5),
|
|
iconSize * 0.1,
|
|
iconPaint,
|
|
);
|
|
|
|
canvas.drawCircle(
|
|
Offset(iconOffset + iconSize * 0.8, size * 0.5),
|
|
iconSize * 0.1,
|
|
iconPaint,
|
|
);
|
|
|
|
// Connecting lines
|
|
final linePaint =
|
|
Paint()
|
|
..color = Colors.white
|
|
..strokeWidth = iconSize * 0.05
|
|
..style = PaintingStyle.stroke;
|
|
|
|
canvas.drawLine(
|
|
Offset(iconOffset + iconSize * 0.3, size * 0.5),
|
|
Offset(iconOffset + iconSize * 0.35, size * 0.5),
|
|
linePaint,
|
|
);
|
|
|
|
canvas.drawLine(
|
|
Offset(iconOffset + iconSize * 0.65, size * 0.5),
|
|
Offset(iconOffset + iconSize * 0.7, size * 0.5),
|
|
linePaint,
|
|
);
|
|
|
|
// End recording
|
|
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_${size}x$size.png');
|
|
await file.writeAsBytes(byteData.buffer.asUint8List());
|
|
print('Generated icon: ${file.path}');
|
|
}
|
|
}
|
|
|
|
// Simple icon untuk development
|
|
static Widget buildSimpleApiIcon({double size = 24, Color? color}) {
|
|
return Container(
|
|
width: size,
|
|
height: size,
|
|
decoration: BoxDecoration(
|
|
color: color ?? Colors.blue,
|
|
borderRadius: BorderRadius.circular(size * 0.1),
|
|
),
|
|
child: Stack(
|
|
alignment: Alignment.center,
|
|
children: [
|
|
// Center dot
|
|
Container(
|
|
width: size * 0.15,
|
|
height: size * 0.15,
|
|
decoration: const BoxDecoration(
|
|
color: Colors.white,
|
|
shape: BoxShape.circle,
|
|
),
|
|
),
|
|
// Left dot
|
|
Positioned(
|
|
left: size * 0.2,
|
|
child: Container(
|
|
width: size * 0.1,
|
|
height: size * 0.1,
|
|
decoration: const BoxDecoration(
|
|
color: Colors.white,
|
|
shape: BoxShape.circle,
|
|
),
|
|
),
|
|
),
|
|
// Right dot
|
|
Positioned(
|
|
right: size * 0.2,
|
|
child: Container(
|
|
width: size * 0.1,
|
|
height: size * 0.1,
|
|
decoration: const BoxDecoration(
|
|
color: Colors.white,
|
|
shape: BoxShape.circle,
|
|
),
|
|
),
|
|
),
|
|
// Connecting lines
|
|
Positioned(
|
|
left: size * 0.3,
|
|
child: Container(
|
|
width: size * 0.05,
|
|
height: size * 0.02,
|
|
color: Colors.white,
|
|
),
|
|
),
|
|
Positioned(
|
|
right: size * 0.3,
|
|
child: Container(
|
|
width: size * 0.05,
|
|
height: size * 0.02,
|
|
color: Colors.white,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|