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


Posted in Javascript onNovember 14, 2018

文字的多行处理在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,就会不显示的。。。

看一下效果:

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

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

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

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

总结

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

Javascript 相关文章推荐
JavaScript 常见对象类创建代码与优缺点分析
Dec 07 Javascript
extjs之去除s.gif的影响
Dec 25 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
Oct 16 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
Nov 13 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
javascript实现简易计算器
Feb 01 Javascript
JS实现元素上下左右移动效果
Oct 18 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
Oct 31 Javascript
vue elementUI使用tabs与导航栏联动
Jun 21 Javascript
jQuery实现验证用户登录
Dec 10 jQuery
Vue 框架之动态绑定 css 样式实例分析
Nov 14 #Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
Nov 14 #Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
Nov 14 #Javascript
Vue源码探究之状态初始化
Nov 14 #Javascript
vue使用laydate时间插件的方法
Nov 14 #Javascript
js使用Promise实现简单的Ajax缓存
Nov 14 #Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 #Javascript
You might like
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
openPNE常用方法分享
2011/11/29 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
php时区转换转换函数
2014/01/07 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
js中的闭包实例展示
2018/11/01 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
wxPython实现分隔窗口
2019/11/19 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
详解Python yaml模块
2020/09/23 Python
Python字典dict常用方法函数实例
2020/11/09 Python
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
人民教师求职自荐信
2014/03/12 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2015年社区民政工作总结
2015/04/21 职场文书