Code前端首页关于Code前端联系我们

微信小程序的画布文本换行和省略显示

terry 2年前 (2023-09-23) 阅读数 73 #移动小程序

多行文本处理在DOM元素中很容易处理。然而,canvas 中没有可用的方法。只有截取指定字符串才能达到目的。

那我介绍一下我自己的处理方法:

wxml:

<canvas canvas-id='word' id='test'></canvas>

Canvas必须有一个artboard容器。不要忘记设置宽度和高度。小程序默认宽度和高度为300px和150px

js:在

//处理文字多出省略号显示
    dealWords: function (options) {
        ();//设置字体大小var allRow = (().width / );//实际总共能分多少行var count = allRow >= options.maxLine ? options.maxLine : allRow;//实际能分多少行与设置的最大显示行数比,谁小就用谁做循环次数var endPos = 0;//当前字符串的截断点for (var j = 0; j < count; j++) {
            var nowStr = .slice(endPos);//当前剩余的字符串var rowWid = 0;//每一行当前宽度    if ((nowStr).width > ) {//如果当前的字符串宽度大于最大宽度,然后开始截取for (var m = 0; m < nowStr.length; m++) {
                    rowWid += (nowStr[m]).width;//当前字符串总宽度if (rowWid > ) {                        
                        if (j === options.maxLine - 1) { //如果是最后一行
                            ((0, m - 1) + '...', options.x, options.y + (j + 1) * 18);    //(j+1)*18这是每一行的高度        
                        } else {
                            ((0, m), options.x, options.y + (j + 1) * 18);
                        }
                        endPos += m;//下次截断点break;
                    }
                }
            } else {//如果当前的字符串宽度小于最大宽度就直接输出
                ((0), options.x, options.y + (j + 1) * 18);
            }
        }
    },

(1)页面measureText().width这是小程序测量文本大小信息的方法。目前仅返回文本宽度。这里是官方的描述

(2) (j + 1) * 18 18 表示每行的行高为 18。这是我自己定义的线高。如果该值小于定义的字体大小,则两行文本很可能会重叠。前面的j+1表示当前行由多少行组成。一般表示的是当前行与上一行之间要增加多少距离

(3) j===中,表示对最后一行的处理,有 slice(0 , endPos-1),为什么在这里?需要减一,因为椭圆也考虑了宽度,可能与 相同,所以椭圆的宽度需要减小。因为汉字的宽度一般与设定的字体大小相当。如果它是英文的,它会更小,这里还没有详细考虑这一点。无论如何,减一意味着准确性。 。 。您可以自己或多或少地减少它

(4) endPos += m 指示下一次截断应开始的位置。因为每次字符串被截断后,都是原来的字符串。没有任何实际意义认为这是一次剪辑后剩余的序列。因此,每次截断点都必须与上一次截断点进行比较。单击加号可查看字符串截断的最后位置。

(5) 循环和判断用得有点多了。我不知道它们对性能是否有任何影响。 。 。 。 。 。如果调用

var ctx = ('word');
var name='窗前明月光,疑是地上霜,举头望明月,低头思故乡。';
this.dealWords({
    ctx: ctx,//画布上下文
    fontSize: 16,//字体大小
    word: name,//需要处理的文字
    maxWidth: 100,//一行文字最大宽度
    x: 0,//文字在x轴要显示的位置
    y: 0,//文字在y轴要显示的位置
    maxLine: 3//文字%

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门