首页 > 其他分享 >canvas文字超出自动换行,并计算canvas高度(使用measureText)

canvas文字超出自动换行,并计算canvas高度(使用measureText)

时间:2024-10-25 15:25:29浏览次数:7  
标签:canvas words 换行 width let measureText lineHeight line

 

超出自动换行:

function drawWrappedText(ctx, text, x, y, maxWidth, lineHeight) {
      let words = text.split(' ');
      let line = '';
      for (let i = 0; i < words.length; i++) {
        let testLine = line + words[i] + ' ';
        let metrics = ctx.measureText(testLine);
        let testWidth = metrics.width;
        if (testWidth > maxWidth && i > 0) {
          ctx.fillText(line, x, y);
          line = words[i] + ' ';
          y += lineHeight;
        } else {
          line = testLine;
        }
      }
      ctx.fillText(line, x, y);
    }

计算换行后的高度:

function calculateTextHeight(ctx, text, maxWidth, lineHeight) {
      let words = text.split(' ');
      let line = '';
      let lineCount = 1;

      for (let i = 0; i < words.length; i++) {
        let testLine = line + words[i] + ' ';
        let metrics = ctx.measureText(testLine);
        let testWidth = metrics.width;
        if (testWidth > maxWidth && i > 0) {
          line = words[i] + ' ';
          lineCount++;
        } else {
          line = testLine;
        }
      }
      return lineCount * lineHeight;
    }

完整样例:

 const drawMap = (
    sprite,
    material,
    name,
    imageUrl,
    width = 1430,
    height = 586) => {
    //绘制canvas
    let canvas = document.createElement('canvas');
    let c = canvas.getContext('2d');
    let nameHeight = height
    canvas.width = width;//默认宽度maxWith
    canvas.height = height;//默认高度
    // 矩形区域填充背景
    c.beginPath();
    let bg = new Image();
    bg.src = bottomBack;
    bg.onload = function () {
      c.font = '140px PingFangSC-Regular';
      const lineHeight = 150;
      //计算换行后的高度
      nameHeight = calculateTextHeight(c, name, canvas.width - 210, lineHeight);
      const lastHeight = Math.max(height, 130 + nameHeight + 300)
      canvas.width = width;
      canvas.height = lastHeight;
        
      //渲染背景图大小(获取高度后渲染)
      c.drawImage(bg, 0, 0, 1430, lastHeight);

      c.beginPath();
      c.textAlign = 'start'
      c.textBaseline = 'top';
      c.fillStyle = '#ffffff';
      c.font = '140px PingFangSC-Regular';
      //渲染自动换行的文本
      drawWrappedText(c, name, 210, 130, canvas.width - 210, lineHeight);
      // c.fillText(name, 210, 130);
      //渲染正常文本
      c.beginPath();
      c.font = '120px PingFangSC-Regular';
      c.textAlign = 'start'
      c.textBaseline = 'top';
      c.fillStyle = '#FA883A';
      c.fillText(`数据中心`, 210, 130 + nameHeight + 50);
        
      material.map = new THREE.CanvasTexture(canvas, { pixelRatio: 10 })
      material.needsUpdate = true
      material.opacity = 1;
      sprite.scale.set(143, lastHeight / 10 || 58.6, 1);

    };
 }

 

标签:canvas,words,换行,width,let,measureText,lineHeight,line
From: https://www.cnblogs.com/Simoon/p/18502606

相关文章

  • C语言基础入门(小白)三种方法解决幽灵换行符问题
    首先,相信很多读者读到题目都会产生一个共同的疑问:什么是幽灵换行符???    幽灵换行符是指:在C语言中,当用scanf函数时,想要输入几个字符,比如:当输入‘a’之后按下回车键,运行自动结束,而不是等待输入第二个字符,第二个字符就像幽灵般消失了,这是为什么呢??    其实,原因......
  • 【Canvas与标牌】黄色圆角方形Premium标牌
    【成图】【代码】<!DOCTYPEhtml><htmllang="utf-8"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><head><title>黄色圆角方形HighQuality标牌</title><styletype="te......
  • js练习:用canvas实现网页画笔效果
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>HTML5Canvas</title><linkrel="icon"href="https://fav.farm/✅"/></head><body><......
  • canvas画图哪些浏览器支持
    Canvas是HTML5的一项重要特性,用于绘制图形和动画。它提供了一个可编程的绘图区域,允许开发者使用JavaScript绘制各种形状、图像和动态效果。canvas画图有以下几个浏览器支持:1、GoogleChrome;2、MozillaFirefox;3、MicrosoftEdge;4、Safari;5、InternetExplorer。Chrome对Canvas提......
  • HTML <canvas> 项目 画个房子
    在HTML、CSS、JS拼搏30余载,终于,有了自己的房子。......
  • document.write() 与 换行的问题(“\r”)不适用 解决办法
    代码:打印n行五角星 <script>      //打印n行n列的输入法☆      varn=prompt("请输入行数");      for(vari=0;i<n;i++){        for(varj=0;j<n;j++){            ......
  • CSS文字超出宽度---换行总结
       <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</titl......
  • WPF中Grid、StackPanel、Canvas、WrapPanel常用属性
    Grid常用属性Grid控件在WPF中非常强大,它提供了多种属性来定义行和列的布局。以下是一些常用的Grid属性:RowDefinitions和ColumnDefinitions:Grid 控件使用 RowDefinitions 和 ColumnDefinitions 来定义行和列的集合。每个 RowDefinition 和 ColumnDefinition......
  • Canvas
    目录新建效果展示参数解释新建选中或者创建新节点手动挂载或者使用快捷键(GameObject->UI->RawImage)创建脚本RawImage效果展示参数解释Canvas是UI在屏幕上或作为3D空间对象进行渲染的方式。提供的选项包括ScreenSpace-Overlay、ScreenSpace-Camera和......
  • Canvas 在前端中的高级应用
    一、引言在前端开发领域,HTML5的 <canvas> 元素为网页带来了强大的绘图和动画功能。它不仅可以用于绘制简单的图形,还能够实现复杂的交互效果和动画场景。以下将详细介绍 canvas 的使用方法,并展示一些高级案例。二、Canvas基础(一)创建Canvas元素在HTML页面中,可以通......