我已经阅读了很多关于如何在Canvas中设置字母间距的StackOverflow答案和其他页面。其中一个更有用的是Canvas元素中的字母间距。
正如另一个问题所说,'我有一个Canvas元素,我要在其上绘制文本。我想设置类似于CSS letter-spacing属性的字母间距。我的意思是,在绘制字符串时增加字母之间的像素量。'请注意,字母间距有时会被错误地称为字距。
我注意到一般的方法似乎是逐个字母地输出字符串,使用measureText(letter)来获取字母的宽度,然后添加额外的间距。这种方法的问题在于它没有考虑字距对和类似的东西。请参见上面的链接以及相关评论的示例。
对我来说,为了实现行间距为“spacing”,应该这样做:
正如另一个问题所说,'我有一个Canvas元素,我要在其上绘制文本。我想设置类似于CSS letter-spacing属性的字母间距。我的意思是,在绘制字符串时增加字母之间的像素量。'请注意,字母间距有时会被错误地称为字距。
我注意到一般的方法似乎是逐个字母地输出字符串,使用measureText(letter)来获取字母的宽度,然后添加额外的间距。这种方法的问题在于它没有考虑字距对和类似的东西。请参见上面的链接以及相关评论的示例。
对我来说,为了实现行间距为“spacing”,应该这样做:
- 从位置(X,Y)开始。
- 使用measureText()测量整个字符串的宽度wAll
- 从字符串中删除第一个字符
- 使用fillText()在位置(X,Y)打印第一个字符
- 使用measureText()测量结果较短字符串的宽度wShorter。
- 将较短字符串的宽度从整个字符串的宽度中减去,得到字符的字距宽度wChar = wAll-wShorter
- 通过wChar + spacing增加X
- wAll = wShorter
- 从步骤3重复
这样不会考虑到字距吗?我有什么遗漏吗?measureText()是否添加了一堆填充,这些填充取决于最外层的字符,如果是这样,那么fillText()是否使用相同的系统来输出字符,从而抵消该问题?上面的链接中有人提到“像素对齐的字体提示”,但我不知道它如何应用于此。任何人都可以通俗易懂地解释一下这是否有效或存在问题吗?
编辑:这不是另一个问题的重复 - 它链接并参考了其他问题。该问题不是关于如何在画布中进行“字母间距调整”的,因此不是所提出的重复问题; 这是提出了可能的解决方案(据我所知,没有其他人提出),以解决该问题和其他问题,并询问是否有人能看到或知道该建议解决方案的任何问题 - 即它正在询问所提出的解决方案及其要点,包括measureText()的详细信息,fillText()和“像素对齐字体提示”。
context.textAlign='center'
水平居中于X轴,context.textBaseline='middle'
垂直居中于Y轴,context.fillText('A',x,y)
在[x,y]处绘制居中的 A。 - markE