应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue3使用canvas进行绘图的时候,动态实现绘制文字居中。实现绘制文字的时候设置间距。有文字间距的情况下动态实现居中

612人阅读 2024/12/17 10:09 总访问:5182261 评论:0 收藏:0 手机
分类: 前端

比如我绘制两个字,drawText(‘李白’, 32,’Arial’, ‘#062466’, 516, 335),最后两个参数是x,y坐标。这样可以文字居中绘制,但是如果绘制的文字变成了三个字,比如drawText(‘黄飞鸿’, 32,’Arial’, ‘#062466’, 516, 335),文字就没有居中了,但是这里的文字是动态的,无法知道是2个字还是3个字,甚至可能是4个字

下面代码实现动态的文字居中绘制(没有文字间距的情况)

要实现动态文字的居中绘制,你需要首先测量文字的宽度,然后根据Canvas的宽度来计算并设置文字的起始x坐标,使其居中。在HTML5 Canvas中,你可以使用measureText方法来获取文本的宽度。

下面是一个示例函数,它接受文本、字体大小、字体样式、字体颜色、Canvas的宽度和期望的垂直位置(y坐标)作为参数,并在Canvas上居中绘制文本:

  1. function drawCenteredText(ctx, text, fontSize, fontFamily, fontColor, canvasWidth, y) {
  2. // 设置字体样式
  3. ctx.font = `${fontSize}px ${fontFamily}`;
  4. // 测量文本的宽度
  5. const textWidth = ctx.measureText(text).width;
  6. // 计算起始x坐标,使文本居中
  7. const x = (canvasWidth - textWidth) / 2;
  8. // 设置文本颜色
  9. ctx.fillStyle = fontColor;
  10. // 绘制文本
  11. ctx.fillText(text, x, y);
  12. }
  13. // 使用示例
  14. const canvas = document.getElementById('myCanvas'); // 替换为你的Canvas元素ID
  15. const ctx = canvas.getContext('2d');
  16. const canvasWidth = canvas.width; // 确保Canvas宽度已被设置
  17. const y = 335; // 垂直位置
  18. // 动态文本
  19. const text1 = '李白';
  20. const text2 = '黄飞鸿';
  21. // 绘制第一个文本
  22. drawCenteredText(ctx, text1, 32, 'Arial', '#062466', canvasWidth, y);
  23. // 如果你想在同一Canvas上绘制另一个文本(可能会覆盖前一个),你需要清除或移动它
  24. // 例如,清除整个Canvas:ctx.clearRect(0, 0, canvasWidth, canvas.height);
  25. // 然后绘制第二个文本
  26. drawCenteredText(ctx, text2, 32, 'Arial', '#062466', canvasWidth, y);

在这个例子中,drawCenteredText函数会根据提供的Canvas宽度和文本宽度来计算起始x坐标,从而确保文本在水平方向上居中。你可以根据需要多次调用这个函数来绘制不同的文本,只要确保每次调用时都提供了正确的参数。

请注意,如果你想要在同一Canvas上绘制多个文本而不覆盖它们,你需要调整它们的y坐标或使用其他方法来管理它们的布局。此外,如果Canvas的宽度是动态的(例如,根据窗口大小调整),你需要确保在调用drawCenteredText之前更新了canvasWidth变量的值。

实现绘制文字的时候设置间距,并且实现文字居中

先封装一个支持绘制文字的时候设置间距的方法

  1. // 可以设置间距的写入方式
  2. const fillTextFromLetterSpacings = (drawctx: any, textToDraw: any, x: number = 50, y: number = 50, letterSpacing: number = 0) => {
  3. // 分割文本为单个字符
  4. const chars = textToDraw.split('')
  5. let currentX = x
  6. // 遍历每个字符并绘制
  7. chars.forEach((char: any) => {
  8. // 测量字符宽度
  9. const textWidth = drawctx.measureText(char).width
  10. // 绘制字符,并在其后添加额外的间距
  11. drawctx.fillText(char, currentX, y)
  12. // 更新当前X位置以包含间距
  13. currentX += textWidth + letterSpacing
  14. })
  15. }

然后在封装绘制有间距文字的时候实现动态居中

  1. // 文字居中的方式绘制,保函可以设置间距
  2. function drawCenteredTextHaveLetterSpacings(ctx:any, text: any, fontSize: number,fontFamily:string, fontColor: string , canvasWidth: number, y: number,letterSpacing: number = 0) {
  3. // 设置字体样式
  4. ctx.font = `${fontSize}px ${fontFamily}`;
  5. // 测量文本的宽度
  6. const textWidth = ctx.measureText(text).width;
  7. // console.log("文字的宽度",textWidth)
  8. // 计算起始x坐标,使文本居中。这里还要减去设置的间距,比如2个字之间就是1个间距,3个字之间就是2个间距
  9. const x = ((canvasWidth - textWidth-(letterSpacing*(text.length-1))) / 2);
  10. // 设置文本颜色
  11. ctx.fillStyle = fontColor;
  12. // 绘制文本
  13. // ctx.fillText(text, x, y);
  14. // 封装可以设置间距的写入方法
  15. fillTextFromLetterSpacings(ctx,text,x,y,letterSpacing)
  16. }

使用方法

  1. let drapName = "地表最强男人"
  2. // drawCenteredText(ctx.value,drapName, 32,'Arial', '#062466', canvasWidth.value, 335)
  3. drawCenteredTextHaveLetterSpacings(ctx.value,drapName, 32,'Arial', '#062466', canvasWidth.value, 335,6)
  4. 466', canvasWidth.value, 335,6)

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue3,vue组件,props给一个对象参数vue组件间传参数vue父组件给子组件传参数组件参数类型父组件调用子组件的方法vue组件事件监听,给子组件传递方法,子组件调用父组件方法

[TOC]组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。 下面是个简单的例子: &lt...

vue3最基础的数据加载,表格table

vue3表格加载一点静态数据 <template> <el-table :data="tableData" style="width: 100%&quot...

vue3 Element Plus 表单输入框放到一行

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。 通过设置 inline 属性为 true 可以让表单域变为行内的表单域...

vue3 Element ui Plus 表格 分页,vue3 el-pagination分页

其实就是el-pagination控件的使用而已 <template> <div> <el-table :data="tableData" ...

vue触发a标签的点击事件vue3 dom操作 触发点击事件 文件选择库只会触发一次change事件的问题

[TOC]vue触发a标签的点击事件直接操作dom节点的方式比较简单 <button @click="handleBtnClick">点击按钮&...

vue3 ref的使用多个ref的使用通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue elementui,vue3 element plus 文件上传的时候设置其他参数后台.net接收传递的额外参数图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vue,vue3 打开新页面,页面跳转vue跳转到一个新页面vue路由传参,vue3路由传参,vue3 获取路由参数

[TOC]VUE页面跳转本地页面跳转 goApplicationCenter() { //进行页面跳转 let path = "/application-center&quo...

vuevue3组件封装,vue组件模板简单组件模板基础组件模板vue引入自定义的组件vue使用自定义的组件插槽slot使用vue封装格子效果,一块一块的grid布局效果

[TOC]vue封装组件的简单模板贴一个简单模板方便自定义组件的时候直接复制 <template> <div class="app...

.net6 Signalr+vue3 的运用(上)

.net6 Signalr+Vue3 的运用(上)[TOC] 什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加...

.net6 Signalr+vue3 的运用(下)

.net6 Signalr+Vue3 的运用(下)[TOC] 上篇链接:https://www.tnblog.net/hb/article/details/7961SignalR 中的用户 Sig...

.net6 Signalr+vue3 配合Ingress Nginx的运用

.net6 Signalr+Vue3 配合Ingress Nginx的运用[TOC] 结合上篇:https://www.tnblog.net/hb/article/details/7963 项目打...

vue3 Element Plus 表格使用vue3常用界面搭配vue3基础模板使用

一个简单的表格加时间搜索界面效果如下: 代码如下: <template> <div class="app-container"&g...

vue3 如何加prototypevue3使用globalProperties

在2.X版本中创建一个vue 实例是通过 new Vue()来实现的,到了3.X中则是通过使用createApp这个 API返回一个应用实例,并且可...