【问题标题】:Flutter: How to paint an Icon on Canvas?Flutter:如何在 Canvas 上绘制图标?
【发布时间】:2024-01-03 18:18:01
【问题描述】:

我正在使用CustomPainter 像这样在 Flutter 中绘图:

@override
void paint(Canvas canvas, Size size) {
  canvas.drawRect(...);
  canvas.drawImage(...);
  ...
}

如何在canvas上画一个Icon

【问题讨论】:

标签: canvas flutter icons custom-painting


【解决方案1】:

@Richard Heap 和 @pskink 根据您的回答,我正在尝试并想出了这个:谢谢你们,这也是我一直在寻找的。​​p>

final icon = Icons.add;
TextPainter textPainter = TextPainter(textDirection: TextDirection.rtl);
textPainter.text = TextSpan(text: String.fromCharCode(icon.codePoint),
        style: TextStyle(fontSize: 40.0,fontFamily: icon.fontFamily));
textPainter.layout();
textPainter.paint(canvas, Offset(50.0,50.0));

【讨论】:

  • 有没有办法在图标上添加 GestureDetector ?
  • 1) 如果您的意思是 IconButton 小部件 - 它有一个 onPressed 功能。 2)如果你想添加上面的CustomPainter,把它作为一个子元素添加到Container。此 Container 的父级可以是 GeatureDetector 或 InkWell。
  • 您还需要将颜色传递给 TextStyle。否则,您将什么都看不到。
【解决方案2】:

创建一个Paragraph,其中包含正确字体的代码点,根据需要设置样式,然后绘制它。

final icon = Icons.add;
var builder = ui.ParagraphBuilder(ui.ParagraphStyle(
  fontFamily: icon.fontFamily,
))
  ..addText(String.fromCharCode(icon.codePoint));
var para = builder.build();
para.layout(const ui.ParagraphConstraints(width: 60));
canvas.drawParagraph(para, const Offset(20, 20));

【讨论】:

【解决方案3】:

只是添加一个小而重要的细节,如果您尝试从外部图标包(例如 Material Design Icons 或 FontAwesome)渲染图标,您需要在 TextStyle 中添加 package 参数。

final icon = MdiIcons.check;
TextPainter textPainter = TextPainter(textDirection: TextDirection.ltr);
textPainter.text = TextSpan(
  text: String.fromCharCode(icon.codePoint),
  style: TextStyle(
    color: Colors.black,
    fontSize: size,
    fontFamily: icon.fontFamily,
    package: icon.fontPackage, // This line is mandatory for external icon packs
  ),
);
textPainter.layout();
textPainter.paint(canvas, Offset(x, y));

【讨论】:

    最近更新 更多