文本选择有很多组成部分,有些是视觉的,有些是非视觉的。
首先,使文本可选择,您必须保留一个数组,其中包含文本的位置、文本是什么以及使用的字体。您将通过 Canvas 函数measureText 使用此信息。
通过使用measureText和文本字符串,您可以确定单击图像时光标应落在哪个字母上。
ctx.fillText("My String", 100, 100);
textWidth = ctx.measureText("My String").width;
您仍然需要从“font”属性中解析字体高度,
因为它目前尚未包含在文本指标中。画布文本已对齐
默认为基线。
有了这些信息,您现在就有了一个可以检查的边界框。
如果光标位于边界框内,那么您现在面临的不幸任务是推导
故意选择哪个字母;光标的起点应该放在哪里。这可能涉及多次调用measureText。
那时你就知道光标应该去哪里了;你需要存储你的
文本字符串作为文本字符串,当然是在变量中。
一旦定义了范围的起点和终点,您就必须绘制
选择指标。这可以在新层(第二个画布元素)中完成,
或者使用 XOR 合成模式绘制矩形。也可以通过以下方式完成
只需清除并重新绘制填充矩形顶部的文本即可。
总而言之,Canvas 中的文本选择、文本编辑编程起来相当费力,明智的做法是重用已经编写的组件,Bespin 就是一个很好的例子。
如果我遇到其他公开的例子,我会编辑我的帖子。我相信 Bespin 使用基于网格的选择方法,可能需要等宽字体。连字、字距调整、双向性和字体渲染的其他高级功能需要额外的编程;这是一个复杂的问题。