如何在 Flutter 中更改 Google 地图标记的图标大小?

2023-11-22

我在用google_maps_flutter在我的颤振应用程序中使用谷歌地图我有自定义标记图标,我加载它BitmapDescriptor.fromAsset("images/car.png")但是我在地图上的图标尺寸太大,我想将其缩小,但我找不到任何选项,是否有任何选项可以更改自定义标记图标。 这是我的颤振代码:

mapController.addMarker(
        MarkerOptions(
          icon: BitmapDescriptor.fromAsset("images/car.png"),

          position: LatLng(
            deviceLocations[i]['latitude'],
            deviceLocations[i]['longitude'],
          ),
        ),
      );

And here is a screenshot of my android emulator:

正如您在图片中看到的,我的自定义图标尺寸太大


TL;DR:只要能够将任何图像编码为原始字节,例如Uint8List,你应该可以用它作为标记。


截至目前,您可以使用Uint8List使用 Google 地图创建标记的数据。这意味着您可以使用raw数据来绘制任何你想要的地图标记,只要你保持正确的编码格式(在这个特定的场景中,是一个png).

我将通过两个示例,您可以:

  1. 选择一个本地资源,动态地将其大小更改为您想要的大小,并将其渲染在地图上(Flutter 徽标图像);
  2. 在画布上绘制一些东西并将其渲染为标记,但这可以是any渲染小部件。

除此之外,您甚至可以在静态图像中转换渲染小部件,因此也可以将其用作标记。


1. 使用资产

首先,创建一个处理资源路径并接收尺寸的方法(可以是宽度、高度或两者,但仅使用一个将保留比例)。

import 'dart:ui' as ui;

Future<Uint8List> getBytesFromAsset(String path, int width) async {
  ByteData data = await rootBundle.load(path);
  ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List(), targetWidth: width);
  ui.FrameInfo fi = await codec.getNextFrame();
  return (await fi.image.toByteData(format: ui.ImageByteFormat.png)).buffer.asUint8List();
}

然后,只需使用正确的描述符将其添加到您的地图中:

final Uint8List markerIcon = await getBytesFromAsset('assets/images/flutter.png', 100);
final Marker marker = Marker(icon: BitmapDescriptor.fromBytes(markerIcon));

这将分别产生以下宽度为 50、100 和 200 的结果。

asset_example


2.使用画布

您可以使用画布绘制任何您想要的东西,然后将其用作标记。下面将产生一些简单的圆形盒子,带有Hello world!其中的文字。

因此,首先使用画布绘制一些东西:

Future<Uint8List> getBytesFromCanvas(int width, int height) async {
  final ui.PictureRecorder pictureRecorder = ui.PictureRecorder();
  final Canvas canvas = Canvas(pictureRecorder);
  final Paint paint = Paint()..color = Colors.blue;
  final Radius radius = Radius.circular(20.0);
  canvas.drawRRect(
      RRect.fromRectAndCorners(
        Rect.fromLTWH(0.0, 0.0, width.toDouble(), height.toDouble()),
        topLeft: radius,
        topRight: radius,
        bottomLeft: radius,
        bottomRight: radius,
      ),
      paint);
  TextPainter painter = TextPainter(textDirection: TextDirection.ltr);
  painter.text = TextSpan(
    text: 'Hello world',
    style: TextStyle(fontSize: 25.0, color: Colors.white),
  );
  painter.layout();
  painter.paint(canvas, Offset((width * 0.5) - painter.width * 0.5, (height * 0.5) - painter.height * 0.5));
  final img = await pictureRecorder.endRecording().toImage(width, height);
  final data = await img.toByteData(format: ui.ImageByteFormat.png);
  return data.buffer.asUint8List();
}

然后以相同的方式使用它,但这次提供您想要的任何数据(例如宽度和高度)而不是资源路径。

final Uint8List markerIcon = await getBytesFromCanvas(200, 100);
final Marker marker = Marker(icon: BitmapDescriptor.fromBytes(markerIcon));

就在这里。

canvas_example

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Flutter 中更改 Google 地图标记的图标大小? 的相关文章

随机推荐

  • 从节点获取所有最后一级子节点(叶子)(分层查询 Oracle 11G)

    我正在尝试并寻找方法从节点获取所有最后一级子节点 叶子 在 Oracle 11g 数据库中的分层查询中 我有两个表 节点 所有节点及其各自值的列表 和指定父子关系的 关系 节点 ID NODE VALUE 1 3 2 6 3 9 4 2 5
  • kotlin 反射检查可空类型

    如何测试 KType 变量是否包含可空 kotlin 类型的值 例如 Int I have var type KType 变量来自于KProperty lt gt returnType我需要检测它是否等于某些 kotlin 类型 Int L
  • 如何使用 Moq 来满足单元测试的 MEF 导入依赖关系?

    这是我的界面 public interface IWork string GetIdentifierForItem Information information 和我的班级 public class A IWork ImportMany
  • Google Play 服务生成 OAuth2.0 客户端时出错

    我正在尝试在我已经发布的应用程序中测试 Google Play 服务功能 我通过下面的链接来做到这一点 https developers google com games services console enabling 当我尝试授权该应
  • 音频处理:播放音量

    我想从应用程序包中读取声音文件 复制它 使用其最大音量级别 增益值或峰值功率 我不确定它的技术名称 播放 然后将其作为另一个文件写入包中再次 我做了抄写部分 生成的文件与输入文件相同 我使用 AudioToolbox 框架中 AudioFi
  • ElasticSearch NEST 客户端未返回结果

    我正在通过 ElasticSearch NEST C 客户端运行一个简单的查询 当我通过 http 运行相同的查询时 我收到结果 但我从客户端返回的文档为零 这就是我填充数据集的方式 curl X POST http localhost 9
  • 如何设置pandas数据框数据左/右对齐?

    I use pd set option display colheader justify right 设置列标题 但我找不到数据选项pd describe option 如何设置数据框中的数据每列显示左对齐或右对齐 或者 是否可以定义整行
  • NSUrlSessionDownloadTask - 进入后台时 didCompleteWithError

    当我通过按电源按钮强制设备进入睡眠模式时 我的后台任务通过调用委托方法停止didCompleteWithError出现错误 操作无法完成 不允许操作 如何配置我的 NSURLSession 即使在睡眠模式下也能继续下载 有可能吗 如果没有
  • SSRS 报告定义比服务器更新

    我在 Visual Studio 2015 中创建了一些包含所有最新更新的报告 但是 当我尝试部署报告时 我收到以下消息 此报表的定义无效或不受此版本的 Reporting Services 支持 11 40 28 错误报表定义可能是使用较
  • 在 tkinter python 中执行(“after”脚本)时如何处理无效命令名称错误

    我知道这个问题已经在这里被多次提出 而且我已经仔细考虑过所有这些问题 但我没有找到解决该问题的明确方法 我知道发生这个错误的原因 我知道使用后root destroy 还有一些工作需要完成等等 但我想知道如何停止那些 之后 的工作 其中一个
  • 防止 jQuery AJAX 调用等待上一个调用完成

    我已经搜索过了 每个问题似乎都在问如何to wait以便完成 AJAX 调用 我问如何不等以便完成 AJAX 调用 我有一个电子商务网站 它通过 PHP 进行一些繁重的图像处理 该操作是通过 AJAX 调用触发的 我试图加快用户体验 因此我
  • 使用 jQuery 合并相等的表格单元格

    带有 NxM 值的简单 html 表格 目的是使用 jQuery 合并列中相等的单元格 请注意 一行中没有重复项 我知道如何隐藏相等的单元格 但是有没有办法将带有数据的单元格与空单元格合并在一起 html table border 1 tr
  • 为什么我无法访问作为参数传递给函数的基类的受保护成员变量?

    This答案似乎表明它应该可以工作 那么为什么我的示例会引发编译器错误 class Class1 protected long m memberVar class SubClass1 public Class1 public void Pr
  • 有小数金额,如果存在,希望修剪到小数点后两位

    有小数金额 如果存在 希望修剪到小数点后两位 你有没有尝试过使用value Decimal Round value 2 例如 using System class Test static void Main decimal d 1234 5
  • 如何在javascript中将数组转换为没有逗号和空格分隔的字符串而不连接?

    我知道您可以通过循环数组元素并连接来完成此操作 但我正在寻找单行解决方案 toString 和 join 返回元素以逗号分隔的字符串 例如 var array apple tree var toString array toString W
  • 货币值字符串以逗号分隔

    我有一个字符串 其中包含格式化的货币值 例如45 890 00和用逗号分隔的多个值 例如45 890 00 12 345 00 23 765 34 56 908 50 我想提取并处理所有货币值 但无法找出正确的正则表达式 这就是我尝试过的
  • 将 clojure 中的两个列表压缩为连接字符串列表

    而不是通过邮政编码映射两个列表来获取 zipmap a b c c d e c e b d a c 我想将第一个列表的第一个元素与第二个列表的第一个元素连接起来 依此类推以获得 ce bd ac 或按相反顺序 你可以这样做map map可以
  • Project Euler 14:与 C 和记忆化的性能比较

    我目前正在研究欧拉计划问题 14 我使用一个编码很差的程序解决了这个问题 没有记忆 需要 386 5 秒才能运行 请参阅编辑 这里是 step Integer Int gt Integer gt Integer Int step i m n
  • 如何在 JavaScript 中访问 Windows 证书存储?

    我想通过 javascript 访问 Windows 证书存储 我想开发一个 Web 应用程序 并希望通过读取证书来验证登录用户 据我所知 如果不使用本机桥 例如通过一些java小程序或activeX组件的实例 则不可能从Web应用程序中实
  • 如何在 Flutter 中更改 Google 地图标记的图标大小?

    我在用google maps flutter在我的颤振应用程序中使用谷歌地图我有自定义标记图标 我加载它BitmapDescriptor fromAsset images car png 但是我在地图上的图标尺寸太大 我想将其缩小 但我找不