使用ucharts开发时遇到图例错位的情况,小程序正常,app上有问题。
排查之后,锁定罪魁祸首是u-charts.js
里面的这段代码。APP计算文字宽度时,匹配不到诸如泰语等文字,字符默认与汉字同宽度。
function measureText(text, fontSize, context) {
var width = 0;
text = String(text);
// #ifdef MP-ALIPAY || MP-BAIDU || APP-NVUE
context = false;
// #endif
if (context !== false && context !== undefined && context.setFontSize && context.measureText) {
context.setFontSize(fontSize);
return context.measureText(text).width;
} else {
var text = text.split('');
for (let i = 0; i < text.length; i++) {
let item = text[i];
if (/[a-zA-Z]/.test(item)) {
width += 7;
} else if (/[0-9]/.test(item)) {
width += 5.5;
} else if (/\./.test(item)) {
width += 2.7;
} else if (/-/.test(item)) {
width += 3.25;
} else if (/:/.test(item)) {
width += 2.5;
} else if (/[\u4e00-\u9fa5]/.test(item)) {
width += 10;
} else if (/\(|\)/.test(item)) {
width += 3.73;
} else if (/\s/.test(item)) {
width += 2.5;
} else if (/%/.test(item)) {
width += 8;
} else {
width += 10;
}
}
return width * fontSize / 10;
}
}
然而,这些无法匹配的文字宽度远没有汉字宽。测试下发现,差距相当离谱。
let item = 'การปรับปรุงล้มเหลว'
console.log(item.length) // 18
let item2 = '我要写十八个字一二三四五六七八九十零'
console.log(item.length) // 18
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
context.font = 'bold 12pt arial'
console.log(context.measureText(item).width) // 142.671875
console.log(context.measureText(item2).width) // 288
解决方案我想到两种,一种是直接图例左对齐,简单粗暴。另一种是修改源码,针对目标语言匹配计算适当宽度。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。