微信小程序中的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中的运用上部
Nov 20 Javascript
jquery blockUI 遮罩不能消失与不能提交的解决方法
Sep 17 Javascript
JQuery性能优化的几点建议
May 14 Javascript
javascript制作游戏开发碰撞检测的封装代码
Mar 31 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
原生JavaScript制作计算器
Oct 16 Javascript
jQuery简单实现对数组去重及排序操作实例
Oct 31 jQuery
详解如何将 Vue-cli 改造成支持多页面的 history 模式
Nov 20 Javascript
微信小程序之多文件下载的简单封装示例
Jan 29 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
JavaScript模拟实现自由落体效果
Aug 28 Javascript
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中函数的形参与实参的问题说明
2010/09/01 PHP
php生成随机密码的几种方法
2011/01/17 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
JS继承用法实例分析
2015/02/05 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
医学院学生求职简历的自我评价
2013/10/24 职场文书
管理部部长岗位职责
2013/12/05 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
稽核岗位职责
2015/02/10 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
环境卫生整治简报
2015/07/20 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android