第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

小程序canvas文本繪制自動換行、字體加粗簡單實現(xiàn)

標(biāo)簽:
JavaScript

直接上代码

Page({    /**
     * 渲染文字
     *
     * @param {Object} obj
     */
    drawText: function (obj) {        console.log('渲染文字')        this.ctx.save();        this.ctx.setFillStyle(obj.color);        this.ctx.setFontSize(obj.size);        this.ctx.setTextAlign(obj.align);        this.ctx.setTextBaseline(obj.baseline);        if (obj.bold) {            console.log('字体加粗')            this.ctx.fillText(obj.text, obj.x, obj.y - 0.5);            this.ctx.fillText(obj.text, obj.x - 0.5, obj.y);
        }        this.ctx.fillText(obj.text, obj.x, obj.y);        if (obj.bold) {            this.ctx.fillText(obj.text, obj.x, obj.y + 0.5);            this.ctx.fillText(obj.text, obj.x + 0.5, obj.y);
        }        this.ctx.restore();
    },    /**
     * 文本换行
     *
     * @param {Object} obj
     */
    textWrap: function (obj) {        console.log('文本换行')        var td = Math.ceil(obj.width / (obj.size));        var tr = Math.ceil(obj.text.length / td);        for (var i = 0; i < tr; i++) {            var txt = {                x: obj.x,                y: obj.y + (i * obj.height),                color: obj.color,                size: obj.size,                align: obj.align,                baseline: obj.baseline,                text: obj.text.substring(i * td, (i + 1) * td),                bold: obj.bold
            };            if (i < obj.line) {                if (i == obj.line-1){
                    txt.text = txt.text.substring(0, txt.text.length - 3) +'......';
                }                this.drawText(txt);
            }
        }
    },
})

参数说明

drawText:
let title = {    x: 40,    y: 524,    color: '#333333',    size: 32,    align: 'left',    baseline: 'top',    text: '哈哈哈哈,加粗',    bold: true};this.drawText(title);
  • <mark id="alqwm"></mark>
    <sub id="alqwm"></sub>

    参数类型说明
    xNumber绘制文本的左上角x坐标位置
    yNumber绘制文本的左上角y坐标位置
    colorColor字体的颜色
    sizeNumber字体的字号
    参数类型说明
    xNumber绘制文本的左上角x坐标位置
    yNumber绘制文本的左上角y坐标位置
    widthNumber文本区域宽度
    heightNumber文本行高
    lineNumber最多显示几行
    colorColor字体的颜色
    sizeNumber字体的字号
    textString在画布上绘制被填充的文本。
    boldBoolean是否加粗

    效果

    生成图片效果

    注意,以上是简单的实现,所以如果有英文会计算不精确,解决方法如下:

    优化原理:通过基础库 1.9.90 开始支持的measureText接口返回的文本宽度,把每个字符宽度不断累加,精确计算在哪个位置应该换行去实现这个功能。

    /**
     * 获取文本折行
     * @param {Object} obj
     * @return {Array} arrTr
     */getTextLine: function(obj){    this.ctx.setFontSize(obj.size);    let arrText = obj.text.split('');    let line = '';    let arrTr = [];    for (let i = 0; i < arrText.length; i++) {        var testLine = line + arrText[i];        var metrics = this.ctx.measureText(testLine);        var width = metrics.width;        if (width > obj.width && i > 0) {
                arrTr.push(line);
                line = arrText[i];
            } else {
                line = testLine;
            }        if (i == arrText.length - 1) {
                arrTr.push(line);
            }
        }    return arrTr;
    },
    参数类型说明
    widthNumber文本区域宽度
    sizeNumber字体的字号
    textString在画布上绘制被填充的文本。

    之后,textWrap方法改为:

    /**
     * 文本换行
     *
     * @param {Object} obj
     */textWrap: function (obj) {    console.log('文本换行')    let tr = this.getTextLine(obj);    for (let i = 0; i < tr.length; i++) {        if (i < obj.line){            let txt = {                x: obj.x,                y: obj.y + (i * obj.height),                color: obj.color,                size: obj.size,                align: obj.align,                baseline: obj.baseline,                text: tr[i],                bold: obj.bold
                };            if (i == obj.line - 1) {
                    txt.text = txt.text.substring(0, txt.text.length - 3) + '......';
                }            this.drawText(txt);
            }
        }
    },

    效果

    有英文字母生成图片效果

    注:在开发工具截取圆形会失效,这张是开发者工具生成的,第一张是真机生成的。

    优化前后对比

    优化前后对比

    补充,字体加粗

    基础库 1.9.90 开始支持设置字体样式 canvasContext.font

    canvasContext.font = value
    value 支持的属性有:
    属性说明
    style字体样式。仅支持 italic, oblique, normal
    weight字体粗细。仅支持 normal, bold
    size字体大小
    family字体族名。注意确认各平台所支持的字体

    加粗如果是不需要兼容的话直接用这个属性就好了,如果需要兼容低版本库,就用重复渲染的方式,希望小程序后续支持多行文本换行吧~

    优化待续...



    作者:不二很纯洁
    链接:https://www.jianshu.com/p/8cadcd731c9f

    點擊查看更多內(nèi)容
    TA 點贊

    若覺得本文不錯,就分享一下吧!

    評論

    作者其他優(yōu)質(zhì)文章

    正在加載中
    • 推薦
    • 1
    • 收藏
    • 共同學(xué)習(xí),寫下你的評論
    感謝您的支持,我會繼續(xù)努力的~
    掃碼打賞,你說多少就多少
    贊賞金額會直接到老師賬戶
    支付方式
    打開微信掃一掃,即可進(jìn)行掃碼打賞哦
    今天注冊有機(jī)會得

    100積分直接送

    付費專欄免費學(xué)

    大額優(yōu)惠券免費領(lǐng)

    立即參與 放棄機(jī)會

    舉報

    0/150
    提交
    取消