!153 feat(utils): 添加文本宽度测量工具函数

* feat(utils): 添加文本宽度测量工具函数
pull/151/MERGE
binny1024 2025-06-15 07:45:51 +00:00 committed by 芋道源码
parent 032c32b337
commit 6c6f8c84aa
2 changed files with 37 additions and 2 deletions

View File

@ -1,10 +1,11 @@
import sheep from '@/sheep';
import { formatImageUrlProtocol, getWxaQrcode } from './index';
import { measureTextWidth } from '@/utils/textUtils'; // 引入新封装的方法
const user = async (poster) => {
const width = poster.width;
const userInfo = sheep.$store('user').userInfo;
const wxa_qrcode = await getWxaQrcode(poster.shareInfo.path, poster.shareInfo.query);
const widthNickName = measureTextWidth(userInfo.nickname, 14); // 使用新方法
return [
{
type: 'image',
@ -28,7 +29,7 @@ const user = async (poster) => {
fontFamily: 'sans-serif',
position: 'fixed',
top: width * 0.4,
left: width / 2,
left: (width-widthNickName) / 2,
},
},
{

34
utils/textUtils.js Normal file
View File

@ -0,0 +1,34 @@
// sheep/utils/textUtils.js
export function measureTextWidth(text, fontSize = 14, fontFamily = 'sans-serif') {
// 钉钉小程序没有 uni.createCanvasContext 方法
if (typeof uni === 'undefined' || typeof uni.createCanvasContext !== 'function') {
return estimateTextWidth(text, fontSize);
}
try {
const ctx = uni.createCanvasContext('tempCanvasForText');
ctx.setFontSize(fontSize);
ctx.font = `${fontSize}px ${fontFamily}`;
const metrics = ctx.measureText(text);
return metrics.width;
} catch (e) {
// 某些平台可能不支持 measureText降级使用估算
return estimateTextWidth(text, fontSize);
}
}
// 简单估算中文和英文字符宽度
function estimateTextWidth(text, fontSize = 14) {
let width = 0;
for (let i = 0; i < text.length; i++) {
const charCode = text.charCodeAt(i);
if (charCode >= 0x4e00 && charCode <= 0x9fff) {
// 中文字符
width += fontSize;
} else {
// 英文字符
width += fontSize * 0.5;
}
}
return width;
}