微信小程序中的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面向对象编程
Mar 18 Javascript
基于jquery的放大镜效果
May 30 Javascript
裁剪字符串trim()自定义改进版
Apr 10 Javascript
jquery禁用右键示例
Apr 28 Javascript
jquery重复提交请求的原因浅析
May 23 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
Oct 21 Javascript
Cookies 和 Session的详解及区别
Apr 21 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
微信小程序商品详情页的底部弹出框效果
Nov 16 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
vue favicon设置以及动态修改favicon的方法
Dec 21 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
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
php通过字符串调用函数示例
2014/03/02 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
php处理带有中文URL的方法
2016/07/11 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
基于node.js的快速开发透明代理
2010/12/25 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
Vue性能优化的方法
2020/07/30 Javascript
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
python difflib模块示例讲解
2017/09/13 Python
python3 读写文件换行符的方法
2018/04/09 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
html5绘制时钟动画
2014/12/15 HTML / CSS
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
安全生产先进个人材料
2014/02/06 职场文书
出纳员岗位责任制
2014/02/11 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
生物工程专业求职信
2014/09/03 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
入党培养人考察意见
2015/06/08 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书