Skip to content

Instantly share code, notes, and snippets.

@mahfuz10
Forked from jbxbergdev/marker_icon_generator.dart
Created February 1, 2021 06:52
Show Gist options
  • Select an option

  • Save mahfuz10/09c25c9573a484c62a3d6d0bd00236f1 to your computer and use it in GitHub Desktop.

Select an option

Save mahfuz10/09c25c9573a484c62a3d6d0bd00236f1 to your computer and use it in GitHub Desktop.

Revisions

  1. mahfuz10 renamed this gist Feb 1, 2021. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. @jbxbergdev jbxbergdev revised this gist Jan 15, 2020. No changes.
  3. @jbxbergdev jbxbergdev revised this gist Jan 14, 2020. 1 changed file with 10 additions and 10 deletions.
    20 changes: 10 additions & 10 deletions marker_icon_generator.dart
    Original file line number Diff line number Diff line change
    @@ -19,40 +19,40 @@ class MarkerGenerator {
    _circleOffset = _markerSize / 2;
    _outlineCircleWidth = _circleOffset - (_circleStrokeWidth / 2);
    _fillCircleWidth = _markerSize / 2;
    var outlineCircleInnerWidth = _markerSize - (2 * _circleStrokeWidth);
    final outlineCircleInnerWidth = _markerSize - (2 * _circleStrokeWidth);
    _iconSize = sqrt(pow(outlineCircleInnerWidth, 2) / 2);
    var rectDiagonal = sqrt(2 * pow(_markerSize, 2));
    var circleDistanceToCorners = (rectDiagonal - outlineCircleInnerWidth) / 2;
    final rectDiagonal = sqrt(2 * pow(_markerSize, 2));
    final circleDistanceToCorners = (rectDiagonal - outlineCircleInnerWidth) / 2;
    _iconOffset = sqrt(pow(circleDistanceToCorners, 2) / 2);
    }

    /// Creates a BitmapDescriptor from an IconData
    Future<BitmapDescriptor> createBitmapDescriptorFromIconData(IconData iconData, Color iconColor, Color circleColor, Color backgroundColor) async {
    var pictureRecorder = PictureRecorder();
    var canvas = Canvas(pictureRecorder);
    final pictureRecorder = PictureRecorder();
    final canvas = Canvas(pictureRecorder);

    _paintCircleFill(canvas, backgroundColor);
    _paintCircleStroke(canvas, circleColor);
    _paintIcon(canvas, iconColor, iconData);

    var picture = pictureRecorder.endRecording();
    var image = await picture.toImage(_markerSize.round(), _markerSize.round());
    var bytes = await image.toByteData(format: ImageByteFormat.png);
    final picture = pictureRecorder.endRecording();
    final image = await picture.toImage(_markerSize.round(), _markerSize.round());
    final bytes = await image.toByteData(format: ImageByteFormat.png);

    return BitmapDescriptor.fromBytes(bytes.buffer.asUint8List());
    }

    /// Paints the icon background
    void _paintCircleFill(Canvas canvas, Color color) {
    var paint = Paint()
    final paint = Paint()
    ..style = PaintingStyle.fill
    ..color = color;
    canvas.drawCircle(Offset(_circleOffset, _circleOffset), _fillCircleWidth, paint);
    }

    /// Paints a circle around the icon
    void _paintCircleStroke(Canvas canvas, Color color) {
    var paint = Paint()
    final paint = Paint()
    ..style = PaintingStyle.stroke
    ..color = color
    ..strokeWidth = _circleStrokeWidth;
  4. @jbxbergdev jbxbergdev revised this gist Jan 14, 2020. 1 changed file with 8 additions and 8 deletions.
    16 changes: 8 additions & 8 deletions marker_icon_generator.dart
    Original file line number Diff line number Diff line change
    @@ -5,23 +5,23 @@ import 'package:flutter/material.dart';
    import 'package:google_maps_flutter/google_maps_flutter.dart';

    class MarkerGenerator {
    final _rectSize;
    final _markerSize;
    double _circleStrokeWidth;
    double _circleOffset;
    double _outlineCircleWidth;
    double _fillCircleWidth;
    double _iconSize;
    double _iconOffset;

    MarkerGenerator(this._rectSize) {
    MarkerGenerator(this._markerSize) {
    // calculate marker dimensions
    _circleStrokeWidth = _rectSize / 10.0;
    _circleOffset = _rectSize / 2;
    _circleStrokeWidth = _markerSize / 10.0;
    _circleOffset = _markerSize / 2;
    _outlineCircleWidth = _circleOffset - (_circleStrokeWidth / 2);
    _fillCircleWidth = _rectSize / 2;
    var outlineCircleInnerWidth = _rectSize - (2 * _circleStrokeWidth);
    _fillCircleWidth = _markerSize / 2;
    var outlineCircleInnerWidth = _markerSize - (2 * _circleStrokeWidth);
    _iconSize = sqrt(pow(outlineCircleInnerWidth, 2) / 2);
    var rectDiagonal = sqrt(2 * pow(_rectSize, 2));
    var rectDiagonal = sqrt(2 * pow(_markerSize, 2));
    var circleDistanceToCorners = (rectDiagonal - outlineCircleInnerWidth) / 2;
    _iconOffset = sqrt(pow(circleDistanceToCorners, 2) / 2);
    }
    @@ -36,7 +36,7 @@ class MarkerGenerator {
    _paintIcon(canvas, iconColor, iconData);

    var picture = pictureRecorder.endRecording();
    var image = await picture.toImage(_rectSize.round(), _rectSize.round());
    var image = await picture.toImage(_markerSize.round(), _markerSize.round());
    var bytes = await image.toByteData(format: ImageByteFormat.png);

    return BitmapDescriptor.fromBytes(bytes.buffer.asUint8List());
  5. @jbxbergdev jbxbergdev created this gist Jan 14, 2020.
    77 changes: 77 additions & 0 deletions marker_icon_generator.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,77 @@
    import 'dart:math';
    import 'dart:ui';

    import 'package:flutter/material.dart';
    import 'package:google_maps_flutter/google_maps_flutter.dart';

    class MarkerGenerator {
    final _rectSize;
    double _circleStrokeWidth;
    double _circleOffset;
    double _outlineCircleWidth;
    double _fillCircleWidth;
    double _iconSize;
    double _iconOffset;

    MarkerGenerator(this._rectSize) {
    // calculate marker dimensions
    _circleStrokeWidth = _rectSize / 10.0;
    _circleOffset = _rectSize / 2;
    _outlineCircleWidth = _circleOffset - (_circleStrokeWidth / 2);
    _fillCircleWidth = _rectSize / 2;
    var outlineCircleInnerWidth = _rectSize - (2 * _circleStrokeWidth);
    _iconSize = sqrt(pow(outlineCircleInnerWidth, 2) / 2);
    var rectDiagonal = sqrt(2 * pow(_rectSize, 2));
    var circleDistanceToCorners = (rectDiagonal - outlineCircleInnerWidth) / 2;
    _iconOffset = sqrt(pow(circleDistanceToCorners, 2) / 2);
    }

    /// Creates a BitmapDescriptor from an IconData
    Future<BitmapDescriptor> createBitmapDescriptorFromIconData(IconData iconData, Color iconColor, Color circleColor, Color backgroundColor) async {
    var pictureRecorder = PictureRecorder();
    var canvas = Canvas(pictureRecorder);

    _paintCircleFill(canvas, backgroundColor);
    _paintCircleStroke(canvas, circleColor);
    _paintIcon(canvas, iconColor, iconData);

    var picture = pictureRecorder.endRecording();
    var image = await picture.toImage(_rectSize.round(), _rectSize.round());
    var bytes = await image.toByteData(format: ImageByteFormat.png);

    return BitmapDescriptor.fromBytes(bytes.buffer.asUint8List());
    }

    /// Paints the icon background
    void _paintCircleFill(Canvas canvas, Color color) {
    var paint = Paint()
    ..style = PaintingStyle.fill
    ..color = color;
    canvas.drawCircle(Offset(_circleOffset, _circleOffset), _fillCircleWidth, paint);
    }

    /// Paints a circle around the icon
    void _paintCircleStroke(Canvas canvas, Color color) {
    var paint = Paint()
    ..style = PaintingStyle.stroke
    ..color = color
    ..strokeWidth = _circleStrokeWidth;
    canvas.drawCircle(Offset(_circleOffset, _circleOffset), _outlineCircleWidth, paint);
    }

    /// Paints the icon
    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));
    }
    }