微信小程序中的canvas 文字断行和省略号显示功能的处理方法

 更新时间:2018年11月14日 11:06:33   作者:站住,别跑  
大家都知道在canvas中没有提供方法来处理文字的多行问题,只有通过截取指定字符串来达到目的。接下来通过本文给大家介绍微信小程序中的canvas 文字断行和省略号显示功能 ,需要的朋友可以参考下

文字的多行处理在dom元素中很好办。但是canvas中没有提供方法,只有通过截取指定字符串来达到目的。

那么下面就介绍我自己处理的办法:

wxml:

<canvas canvas-id='word' id='test'></canvas>

canvas肯定要一个画板容器啦,记得设置宽高哦,小程序中默认宽高是300px和150px

js:在page中

//处理文字多出省略号显示
  dealWords: function (options) {
    options.ctx.setFontSize(options.fontSize);//设置字体大小
    var allRow = Math.ceil(options.ctx.measureText(options.word).width / options.maxWidth);//实际总共能分多少行
    var count = allRow >= options.maxLine ? options.maxLine : allRow;//实际能分多少行与设置的最大显示行数比,谁小就用谁做循环次数
    var endPos = 0;//当前字符串的截断点
    for (var j = 0; j < count; j++) {
      var nowStr = options.word.slice(endPos);//当前剩余的字符串
      var rowWid = 0;//每一行当前宽度  
      if (options.ctx.measureText(nowStr).width > options.maxWidth) {//如果当前的字符串宽度大于最大宽度,然后开始截取
        for (var m = 0; m < nowStr.length; m++) {
          rowWid += options.ctx.measureText(nowStr[m]).width;//当前字符串总宽度
          if (rowWid > options.maxWidth) {            
            if (j === options.maxLine - 1) { //如果是最后一行
              options.ctx.fillText(nowStr.slice(0, m - 1) + '...', options.x, options.y + (j + 1) * 18);  //(j+1)*18这是每一行的高度    
            } else {
              options.ctx.fillText(nowStr.slice(0, m), options.x, options.y + (j + 1) * 18);
            }
            endPos += m;//下次截断点
            break;
          }
        }
      } else {//如果当前的字符串宽度小于最大宽度就直接输出
        options.ctx.fillText(nowStr.slice(0), options.x, options.y + (j + 1) * 18);
      }
    }
  },

(1) measureText().width 这是小程序 测量文本尺寸信息的方法,目前仅返回文本宽度。这里是官方说明

(2) (j + 1) * 18   中18表示每一行行高是18,这是我自己定义的行高如果这个数值小于定义的字体大小,多半会出现两行文字重叠的现象,前面的 j+1 表示当前是多少行。整体表示当前行与上一行相比需要加多少距离

(3) 在 j===options.maxLine-1 这个表示最后一行的处理情况里面   有slice(0,endPos-1),为什么这里要减一,是因为省略号也要占宽度,大概是11.5的样子,所以要减掉这个省略号的宽度。因为一般中文字符宽度都和设置的字体大小差不多。如果是英文就要小一点,这里就没有考虑这么精细了。反正减一就是精确度的意思。。。可以自行多减或者少减

(4) endPos += m 表示下一次截断的时候是从哪里开始。因为每次去截字符串都是最初的字符串,并没有真正意义上的截断一次之后就是剩下的字符串了,所以要把每次截断的点和上一次截断的点加上,才是最新一次字符串截断的位置。

(5) 循环和判断使用的有点多,不知道对性能有没有影响。。。。。。

调用的时候:

var ctx = wx.createCanvasContext('word');
var name='窗前明月光,疑是地上霜,举头望明月,低头思故乡。';
this.dealWords({
  ctx: ctx,//画布上下文
  fontSize: 16,//字体大小
  word: name,//需要处理的文字
  maxWidth: 100,//一行文字最大宽度
  x: 0,//文字在x轴要显示的位置
  y: 0,//文字在y轴要显示的位置
  maxLine: 3//文字最多显示的行数
})
ctx.draw();

 (1) 这个方法能够处理一行或者多行的情况,就看maxLine设置的大小了。当然如果设置maxLine为0或者-1,就会不显示的。。。

看一下效果:

(1) canvas我设置的是200 * 200的大小,其它的设置就是上面调用的时候设置的

(1) 这是当maxWidth设置为200px的时候的显示情况。

总结

以上所述是小编给大家介绍的微信小程序中的canvas 文字断行和省略号显示功能的处理方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 原生js实现移动端触摸轮播的示例代码

    原生js实现移动端触摸轮播的示例代码

    下面小编就为大家分享一篇原生js实现移动端触摸轮播的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • js判断移动端横竖屏视口检测实现的几种方法

    js判断移动端横竖屏视口检测实现的几种方法

    最近做歌一个小项目,但是要放到我们的app上,然而需要横竖屏使用不同的样式,本文就来介绍一下js判断移动端横竖屏视口检测实现的几种方法,感兴趣的可以了解一下
    2021-07-07
  • javascript 打印内容方法小结

    javascript 打印内容方法小结

    关于JS打印问题!网上收集+自己总结 ,需要的朋友可以参考下。
    2009-11-11
  • 浅谈JavaScript 代码简洁之道

    浅谈JavaScript 代码简洁之道

    这篇文章主要介绍了浅谈JavaScript 代码简洁之道,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • TypeScript接口使用介绍

    TypeScript接口使用介绍

    接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法
    2022-10-10
  • JavaScript多功能甘特图组件jsGantt详解

    JavaScript多功能甘特图组件jsGantt详解

    jsGantt是一个可定制的、灵活的、多语言的甘特图组件,由原生 JavaScript构建,它使用客户端渲染以获得快速的性能和动态的交互性,非常适用于任何需要交互式时间线或时间表显示的项目,本文就给大家介绍一下JavaScript多功能甘特图组件jsGantt
    2023-07-07
  • DWR中各种java方法的调用

    DWR中各种java方法的调用

    DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码。它的实现是基于ajax的,可以实现无刷新效果。不少DWR的例子,但大都只是某种方法的调用只在使用层面上介绍DWR,并不涉更多的技术与设计javascript中是如何调用的。
    2016-05-05
  • 一文详解JavaScript中的fetch方法

    一文详解JavaScript中的fetch方法

    fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,这篇文章主要介绍了JavaScript中fetch方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • 微信小程序scroll-view实现字幕滚动

    微信小程序scroll-view实现字幕滚动

    这篇文章主要为大家详细介绍了微信小程序scroll-view实现字幕滚动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字

    javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字

    前两讲我告诉了大家如何使人物移动,那么今天我们就来看看如何实现仿《三国志曹操传》人物情景对话,感兴趣的朋友可以了解下,希望本文对你有所帮助
    2013-01-01

最新评论