Flutter 高德地图应用之一:将widget 转换成高德地图的maker 图标

按:笔者刚刚开始学习flutter,起因是想做一个跨平台的地图应用,因此就开始学习flutter 和高德地图的结合应用。
本方法受到Google MarkIcon 代码的启发而成,大致思路是将widget 画在canvas上面,然后截屏,获得img,将img转换成dataByte,再利用高德有关函数将其转换成高德地图可用的icon。

生成dataByte的代码如下

import 'dart:math';
import 'dart:ui' as ui;
import 'dart:typed_data';

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

class Tool {
 // The fowllong is from the source of mark_icon
  static Future<Uint8List> circleCanvasWithText({
    required Size size,
    required String text,
    double fontSize = 15.0,
    Color circleColor = Colors.red,
    Color fontColor = Colors.black,
    FontWeight fontWeight = FontWeight.w500,
  }) async {
    final ui.PictureRecorder pictureRecorder = ui.PictureRecorder();
    final Canvas canvas = Canvas(pictureRecorder);
    final Paint paint = Paint()..color = circleColor;
    final Radius radius = Radius.circular(size.width / 2);

    canvas.drawRRect(
        RRect.fromRectAndCorners(
          Rect.fromLTWH(
              0.0, 0.0, size.width.toDouble(), size.height.toDouble()),
          topLeft: radius,
          topRight: radius,
          bottomLeft: radius,
          bottomRight: radius,
        ),
        paint);

    TextPainter painter = TextPainter(textDirection: TextDirection.ltr);
    painter.text = TextSpan(
      text: text,
      style: TextStyle(
          fontSize: fontSize, color: fontColor, fontWeight: fontWeight),
    );

    painter.layout();
    painter.paint(
        canvas,
        Offset((size.width * 0.5) - painter.width * 0.5,
            (size.height * .5) - painter.height * 0.5));

    final img = await pictureRecorder
        .endRecording()
        .toImage(size.width.toInt(), size.height.toInt());
    final data = await img.toByteData(format: ui.ImageByteFormat.png);

    return data!.buffer.asUint8List();
  }
}

使用方法:

// BitmapDescriptor 是高德地图中的定义,和Google的有区别,这也是诞生这个做法的原因。
late BitmapDescriptor? m_MeIcon = null;
......
//初始化检测
 if (m_MeIcon == null) m_MeIcon = await _GetMeIcon();
    final Marker marker = Marker(
      position: markerPosition,
      rotation: rotation,
      //使用默认hue的方式设置Marker的图标

      icon: m_MeIcon!,
    );

......
//异步函数,异步是因为里面的circleCanvasWithText 是异步的。
Future<BitmapDescriptor> _GetMeIcon() async {
    var imgData = await Tool.circleCanvasWithText(
        size: const ui.Size(40, 40),
        text: '↑',
        circleColor: const Color.fromARGB(128, 255, 0, 0),
        fontColor: Colors.white,
        fontSize: 22);
    var myIcon = BitmapDescriptor.fromBytes(imgData);
    // _markers['circleCanvasWithText'] = Marker(
    //   icon: myIcon,
    //   position: LatLng(_currentLatLng.latitude, _currentLatLng.longitude),
    // );
    return myIcon;
  }

2022 这个充满泪雨声风的365 天就要结束了, 在经过忐忑的 阳化 过程之后,好像并没有变得更踏实些。生命,生活其实大抵如此,你永远不知道明天甚至下一秒会发生什么。

预祝各味2023年身体健康,依然快乐!

maraSun BJFWDQ
2022-12-30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值