前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信小程序开发:canvas 多行文字换行(二)

微信小程序开发:canvas 多行文字换行(二)

原创
作者头像
田超
修改2018-06-13 12:41:24
2.1K0
修改2018-06-13 12:41:24
举报
文章被收录于专栏:田超学前端

微信小程序开发中,canvas画出一篇文章,由于句子长短不一,画起来确实是费劲,查了不少资料,总结一下:

html部分:

<canvas id='secondCanvas' canvas-id='secondCanvas' style='width:{{414}}px;height:{{750}}px;'></canvas>

js部分:

function findBreakPoint(text, width, context) {

var min = 0;

var max = text.length - 1;

while (min <= max) {

var middle = Math.floor((min + max) / 2);

var middleWidth = context.measureText(text.substr(0, middle)).width;

var oneCharWiderThanMiddleWidth = context.measureText(text.substr(0, middle + 1)).width;

if (middleWidth <= width && oneCharWiderThanMiddleWidth > width) {

return middle;

}

if (middleWidth < width) {

min = middle + 1;

} else {

max = middle - 1;

}

}

return -1;

}

function breakLinesForCanvas(context, text, width, font) {

var result = [];

if (font) {

context.font = font;

}

var textArray = text.split('\r\n');

for (let i = 0; i < textArray.length; i++) {

let item = textArray[i];

var breakPoint = 0;

while ((breakPoint = findBreakPoint(item, width, context)) !== -1) {

result.push(item.substr(0, breakPoint));

item = item.substr(breakPoint);

}

if (item) {

result.push(item);

}

}

return result;

}

Page({

/**

* 页面的初始数据

*/

data: {

id: 0,

info: {}

},

/**

* 生命周期函数--监听页面加载

*/

onLoad: function (options) {

var that = this

let info = {

"0": "标题标题标题标题标题标题标题标题",

"1": "内容内容内容内容内容内容内容内容内容内容内容",

"2": "我是我是我是我是我是我是我是我是我是我是我是我是我是我是我是我是我是我是我是我是我是",

};

that.drawInit(info);

},

canvasIdErrorCallback: function (e) {

console.error(e.detail.errMsg)

},

/**

* 生命周期函数--监听页面初次渲染完成

*/

onReady: function (e) {},

/**

* 绘制图片

*/

drawInit(info){

var that = this

var res = wx.getSystemInfoSync()

var canvasWidth = res.windowWidth

// 获取canvas的的宽 自适应宽(设备宽/750) px

var Rpx = (canvasWidth / 375).toFixed(2)

//画布高度 -底部按钮高度

var canvasHeight = res.windowHeight - Rpx * 59

// 使用 wx.createContext 获取绘图上下文 context

var context = wx.createCanvasContext('secondCanvas')

//设置行高

var lineHeight = Rpx * 30

//左边距

var paddingLeft = Rpx * 20

//右边距

var paddingRight = Rpx * 20

//当前行高

var currentLineHeight = Rpx * 20

var result

for (var i in info){

result = breakLinesForCanvas(context, info[i] || '无内容', canvasWidth - paddingLeft - paddingRight, `${(Rpx * 16).toFixed(0)}px PingFangSC-Regular`)

//字体颜色

context.fillStyle = '#000000'

result.forEach(function (line, index) {

currentLineHeight += Rpx * 30

context.fillText(line, paddingLeft, currentLineHeight) // currentLineHeight 表示文字在整个页面的位置:currentLineHeight + 300 表示整体下移 300px

});

}

context.draw()

}

})

先这样吧。。。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档