微信小程序中的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英文日期(有时间)选择器
May 02 Javascript
javascript sudoku 数独智力游戏生成代码
Mar 27 Javascript
Javascript 面向对象(二)封装代码
May 23 Javascript
原生javascript图片自动或手动切换示例附演示源码
Sep 04 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
node.js中的fs.appendFileSync方法使用说明
Dec 17 Javascript
js验证真实姓名与身份证号是否匹配
Oct 13 Javascript
JavaScript SHA1加密算法实现详细代码
Oct 06 Javascript
Angular的$http与$location
Dec 26 Javascript
node.js实现回调的方法示例
Mar 01 Javascript
Node做中转服务器转发接口
Oct 18 Javascript
vue实现验证用户名是否可用
Jan 20 Vue.js
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
图书管理程序(三)
2006/10/09 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
javascript prototype 原型链
2009/03/12 Javascript
js tab 选项卡
2009/04/26 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
Python类的专用方法实例分析
2015/01/09 Python
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
python实现分页效果
2017/10/25 Python
django云端留言板实例详解
2019/07/22 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
PHP开发的一般流程
2013/08/13 面试题
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
小学优秀教育工作者事迹材料
2014/05/09 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
运动会800米赞词
2015/07/22 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android
MySQL池化框架学习接池自定义
2022/07/23 MySQL