如何使画布文本可选择?

2024-03-11

任何建议都将受到高度赞赏。


文本选择有很多组成部分,有些是视觉的,有些是非视觉的。

首先,使文本可选择,您必须保留一个数组,其中包含文本的位置、文本是什么以及使用的字体。您将通过 Canvas 函数measureText 使用此信息。

通过使用measureText和文本字符串,您可以确定单击图像时光标应落在哪个字母上。

ctx.fillText("My String", 100, 100);
textWidth = ctx.measureText("My String").width;

您仍然需要从“font”属性中解析字体高度, 因为它目前尚未包含在文本指标中。画布文本已对齐 默认为基线。

有了这些信息,您现在就有了一个可以检查的边界框。 如果光标位于边界框内,那么您现在面临的不幸任务是推导 故意选择哪个字母;光标的起点应该放在哪里。这可能涉及多次调用measureText。

那时你就知道光标应该去哪里了;你需要存储你的 文本字符串作为文本字符串,当然是在变量中。

一旦定义了范围的起点和终点,您就必须绘制 选择指标。这可以在新层(第二个画布元素)中完成, 或者使用 XOR 合成模式绘制矩形。也可以通过以下方式完成 只需清除并重新绘制填充矩形顶部的文本即可。

总而言之,Canvas 中的文本选择、文本编辑编程起来相当费力,明智的做法是重用已经编写的组件,Bespin 就是一个很好的例子。

如果我遇到其他公开的例子,我会编辑我的帖子。我相信 Bespin 使用基于网格的选择方法,可能需要等宽字体。连字、字距调整、双向性和字体渲染的其他高级功能需要额外的编程;这是一个复杂的问题。

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

如何使画布文本可选择? 的相关文章

随机推荐

  • 使用 Laravel 邮件类时如何设置 SwifMailer 插件?

    Laravel 不会返回任何有用的信息来显示电子邮件失败的原因 斯威夫邮递员记录器插件 http swiftmailer org docs plugins html logger plugin有助于发送过程中的调试 当通过 Laravel
  • 赋值运算符真的“只是”一个运算符吗?

    我的问题是由this https stackoverflow com questions 63228851 does assignment precede logical operator in ruby 63230036 noredire
  • 驱动程序如何成为操作系统的一部分?

    我知道操作系统内核是由驱动程序组成的 但是驱动程序是如何成为操作系统的一部分的 是内核自己反编译 然后添加驱动程序并重新编译自己吗 或者驱动程序是内核的插件 有人告诉我 对于大多数操作系统 驱动程序实际上成为内核的一部分 但是每当我编译c程
  • pycharm看不到python3.7解释器

    我在 Linux Mint 19 Tara Xfce 上使用 Pycharm Community 2018 1 4 它与 Python 3 5 解释器配合良好 我安装了 Python 3 7 作为系统上默认的 Python 解释器 pyth
  • 修改LD_LIBRARY_PATH

    在 UNIX 中 我正在尝试修改LD LIBRARY PATH为了使其包含一些库 我无法添加到系统的常规库中 我没有根权限 它是大学服务器 此时我已经使用了很多我在网络上找到的方法执行此操作但无法修改它 我也看不到是什么PATH 我尝试过使
  • 反转 ResourceManager

    如果执行 ResourceManager GetString Key 则可以获得资源中项目的值 有没有办法进行反向查找以从给定值的资源中获取密钥 本质上是反翻译 您应该能够获取 ResourceSet 并迭代它的值 如果它们相等则返回键 请
  • CUDA 标量和 SIMD 视频指令的效率

    SIMD指令的吞吐量低于32位整数运算 如果是 SM2 0 仅标量指令版本 则低 2 倍 如果是 SM3 0 则低 6 倍 什么情况下适合使用它们 如果您的数据已经以 SIMD 视频指令本机处理的格式打包 则需要多个步骤对其进行解包 以便可
  • 如何让树视图重新考虑是否需要水平滚动条?

    考虑以下非常简单的单元 Unit1 pas unit Unit1 interface uses Windows Classes Controls Forms ComCtrls type TForm1 class TForm TreeView
  • 使用内部/外部传播包

    我想在我的模拟中放置一个 系统 组件 类似于Modelica Fluid System and Modelica Mechanics MultiBody World 所有其他组件都可以从中访问Medium包 以便在整个流程图中仅设置一次工作
  • matplotlib 交互式绘图(在图表上手动绘制线条)

    我已经使用 matplotlib 成功绘制了一组日期排序数据 X 轴是日期 但是 我希望能够manually在绘制的图表上从一个 date1 y1 到另一个 date2 y2 绘制线条 我似乎找不到任何例子来说明如何做到这一点 或者实际上是
  • 如何为 Ionic 4(android / ios)应用程序创建 google pay?

    我使用以下方法创建了 google pay for web URL Google 网络付费 https developers google com pay api web guides tutorial 我想为 ionic 4 应用程序创建
  • 转换为 UCS2

    Vb net 或C 中是否有任何函数可以对UCS2中的字符串进行编码 Thanks 使用以下函数以 UCS2 格式对 unicode 字符串进行编码 gt Used to encoding GSM message as UCS2 publi
  • Data.table:连接 ID 和日期键,但希望第一个表中的日期键之前(或等于)最接近的日期

    我真的很感谢对这个问题的一些帮助 我找不到足够接近的例子 我有两个 data tables 第一个称为customer table 包含特定于时间戳 AsOfDate 第二个表称为activity table描述发送给该客户的营销活动Act
  • MonoDevelop - 转换行结束对话框

    我经常在 Linux 上的 MonoDevelop 和具有相同代码库的 VS2010 之间切换 因此我永远不得不单击不转换行结尾 MonoDevelop 中是否有一个选项可以设置默认答案以防止弹出此对话框 找到了 编辑 gt 首选项 gt
  • 无法更改 root 帐户的密码 ansible

    我有以下错误 failed true invocation module args append privs false check implicit admin true config file root my cnf connect t
  • Unicorn Rails - 在生产模式下启动时占用 100% CPU

    我们使用 Unicorn Rails nginx 它在我的系统中的开发模式和生产模式下运行良好 4GB RAM Intel R Core TM 2 Duo CPU P8600 2 40GHz 我可以在本地系统中启动 10 个工作人员 但在生
  • 如何使用Android传感器计算旋转角度?

    我正在做一个 Opengl 应用程序 如果 Android 设备沿 Z 轴旋转 倾斜 我必须旋转相机 我尝试过SensorManager getOrientation R orientVals 使用磁性和加速度传感器 但数值波动很大 我的设
  • UpgradeableApp API 不断给出“无效的 OAuth 消费者密钥”

    给出以下 ruby 代码 consumer OAuth Consumer new consumer key consumer secret site https www googleapis com resp consumer reques
  • 在python中获取方阵的上三角形或下三角形的所有元素

    numpy scipy 中是否有一个函数可以返回方阵的一个三角形 上或下 的所有元素 e g matrix 1 2 3 4 5 6 7 8 9 三角形 上 下 up 1 2 3 5 6 9 down 1 4 5 7 8 9 or up 1
  • 如何使画布文本可选择?

    任何建议都将受到高度赞赏 文本选择有很多组成部分 有些是视觉的 有些是非视觉的 首先 使文本可选择 您必须保留一个数组 其中包含文本的位置 文本是什么以及使用的字体 您将通过 Canvas 函数measureText 使用此信息 通过使用m