微信小程序中的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 相关文章推荐
js版本A*寻路算法
Dec 22 Javascript
JavaScript中获取元素索引的函数
Sep 10 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 Javascript
js数组中如何随机取出一个值
Jun 13 Javascript
JavaScript数据类型学习笔记分享
Sep 01 Javascript
js实现日历的简单算法
Jan 24 Javascript
原生JS实现左右箭头选择日期实例代码
Mar 14 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
May 17 jQuery
layui radio性别单选框赋值方法
Aug 15 Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 Javascript
javascript实现滚轮轮播图片
Dec 13 Javascript
vue动态绑定style样式
Apr 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
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
php实现word转html的方法
2016/01/22 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
JS实现自动切换文字的导航效果代码
2015/08/27 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
利用Python爬取可用的代理IP
2016/08/18 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
白色公司:The White Company
2017/10/11 全球购物
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
毕业生求职简历的自我评价
2013/10/07 职场文书
教育孩子心得体会
2014/01/01 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
缓刑人员的思想汇报
2014/01/11 职场文书
项目转让协议书
2014/10/27 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript