From d0a80b902db64405c428fefdfa41699642e03108 Mon Sep 17 00:00:00 2001 From: xubinbin0303 Date: Tue, 10 Jun 2025 20:56:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(utils):=20=E6=B7=BB=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E5=AE=BD=E5=BA=A6=E6=B5=8B=E9=87=8F=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 measureTextWidth 函数,用于测量文本宽度- 该函数优先使用 uni.createCanvasContext 方法测量文本宽度 - 如果无法使用 createCanvasContext,降级使用简单估算方法 - 在 s-share-modal 组件中应用该函数,用于精确计算昵称宽度 --- .../canvas-poster/poster/user.js | 5 +-- utils/textUtils.js | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 utils/textUtils.js diff --git a/sheep/components/s-share-modal/canvas-poster/poster/user.js b/sheep/components/s-share-modal/canvas-poster/poster/user.js index 5c4d3b96..aa73922e 100644 --- a/sheep/components/s-share-modal/canvas-poster/poster/user.js +++ b/sheep/components/s-share-modal/canvas-poster/poster/user.js @@ -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, }, }, { diff --git a/utils/textUtils.js b/utils/textUtils.js new file mode 100644 index 00000000..f6231a0d --- /dev/null +++ b/utils/textUtils.js @@ -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; +} -- Gitee