import 'dart:math'; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; class MarkerGenerator { final double _markerSize; double _circleStrokeWidth = 0; double _circleOffset = 0; double _outlineCircleWidth = 0; double _fillCircleWidth = 0; double _iconSize = 0; double _iconOffset = 0; MarkerGenerator(this._markerSize) { _circleStrokeWidth = _markerSize / 10.0; _circleOffset = _markerSize / 2; _outlineCircleWidth = _circleOffset - (_circleStrokeWidth / 2); _fillCircleWidth = _markerSize / 2; final outlineCircleInnerWidth = _markerSize - (2 * _circleStrokeWidth); _iconSize = sqrt(pow(outlineCircleInnerWidth, 2) / 2); final rectDiagonal = sqrt(2 * pow(_markerSize, 2)); final circleDistanceToCorners = (rectDiagonal - outlineCircleInnerWidth) / 2; _iconOffset = sqrt(pow(circleDistanceToCorners, 2) / 2); } Future createBitmapDescriptorFromIconData(IconData iconData, Color iconColor, Color circleColor, Color backgroundColor) async { final pictureRecorder = PictureRecorder(); final canvas = Canvas(pictureRecorder); _paintCircleFill(canvas, backgroundColor); _paintCircleStroke(canvas, circleColor); _paintIcon(canvas, iconColor, iconData); final picture = pictureRecorder.endRecording(); final image = await picture.toImage(_markerSize.round(), _markerSize.round()); final bytes = await image.toByteData(format: ImageByteFormat.png); return BitmapDescriptor.bytes(bytes!.buffer.asUint8List()); } void _paintCircleFill(Canvas canvas, Color color) { final paint = Paint() ..style = PaintingStyle.fill ..color = color; canvas.drawCircle( Offset(_circleOffset, _circleOffset), _fillCircleWidth, paint); } void _paintCircleStroke(Canvas canvas, Color color) { final paint = Paint() ..style = PaintingStyle.stroke ..color = color ..strokeWidth = _circleStrokeWidth; canvas.drawCircle( Offset(_circleOffset, _circleOffset), _outlineCircleWidth, paint); } void _paintIcon(Canvas canvas, Color color, IconData iconData) { final textPainter = TextPainter(textDirection: TextDirection.ltr); textPainter.text = TextSpan( text: String.fromCharCode(iconData.codePoint), style: TextStyle( letterSpacing: 0.0, fontSize: _iconSize, fontFamily: iconData.fontFamily, color: color, )); textPainter.layout(); textPainter.paint(canvas, Offset(_iconOffset, _iconOffset)); } }