1、问题及解决方式

最近在工作中需要在后端计算出文本的宽度,生成svg文件后返回前端,查了下资料,可用以下代码计算文字宽度,再加上padding的宽度即可获得想要的显示效果:

String str = "Hello World!";
Font font = new Font("Microsoft YaHei", Font.PLAIN, 12);
FontRenderContext frc = new FontRenderContext(null, false, false);
int textwidth = (int)(font.getStringBounds(str, frc).getWidth());
System.out.println(textwidth);

2、相关说明

  • Font

构造方法:

Font(String name, int style, int size)

用指定的字体名称、样式、大小创建字体对象。

getStringBounds()

Rectangle2D getStringBounds(String str, FontRenderContext frc)

返回指定文本的FontRenderContext的逻辑边界(Rectangle2D)。

  • FontRenderContext

FontRenderContext类是正确度量文本所需信息的容器,由于将轮廓映射到像素的规则以及应用程序提供的渲染点不同,文本的度量可能会有所差别。通常,FontRenderContext的实例是从Graphics2D对象获得的,直接构造的FontRenderContext很可能不会表示任何实际的图形设备,并可能导致意外或不正确的结果。

构造方法:

FontRenderContext(AffineTransform tx, boolean isAntiAliased, boolean usesFractionalMetrics)

从一个可选的AffineTransform对象和两个boolean变量:是否抗锯齿值和使用小数度量标准来构造FontRenderContext对象。

  • AffineTransform

AffineTransform类表示2D几何变换,其执行从2D坐标到其他2D坐标的线性映射,其保持线的”直线性”和”平行性”, 可以使用平移、缩放、翻转、旋转和剪切的顺序来构造几何变换。

  • Rectangle2D

Rectangle2D类是存储2D矩形所有对象的抽象超类,描述了由位置(x,y)和维度(w x h)定义的矩形。

参考资料: