fix: lucky page

This commit is contained in:
zzc
2026-02-24 20:08:08 +08:00
parent 74679b0407
commit aa09652069

View File

@@ -251,78 +251,108 @@ const onSaveImage = () => {
// 5. 绘制内容区 (宜/忌) // 5. 绘制内容区 (宜/忌)
const gridY = 400; const gridY = 400;
const boxW = (W - 64 - 24) / 2; // (600 - padding*2 - gap)/2 const boxW = (W - 64 - 24) / 2; // (600 - padding*2 - gap)/2
const gridH = 140; // 增加高度防止内容溢出
// 宜 // 宜
drawBox(ctx, 32, gridY, boxW, 120, "#fbfbfb", "#f5f5f5"); drawBox(ctx, 32, gridY, boxW, gridH, "#fbfbfb", "#f5f5f5");
ctx.setTextAlign("left"); ctx.setTextAlign("left");
ctx.setFontSize(24); ctx.setFontSize(24);
ctx.setFillStyle("#d81e06"); ctx.setFillStyle("#d81e06");
ctx.fillText("✔ 今日宜", 56, gridY + 40); ctx.font = "bold 24px sans-serif";
// 图标模拟
ctx.fillText("✔ 今日宜", 56, gridY + 44);
ctx.setFontSize(22); ctx.setFontSize(22);
ctx.setFillStyle("#666666"); ctx.setFillStyle("#666666");
wrapText(ctx, resultData.value.yi, 56, gridY + 70, boxW - 48, 30); ctx.font = "normal 22px sans-serif";
wrapText(ctx, resultData.value.yi, 56, gridY + 80, boxW - 48, 30);
// 忌 // 忌
drawBox(ctx, 32 + boxW + 24, gridY, boxW, 120, "#fbfbfb", "#f5f5f5"); drawBox(ctx, 32 + boxW + 24, gridY, boxW, gridH, "#fbfbfb", "#f5f5f5");
ctx.setFontSize(24); ctx.setFontSize(24);
ctx.setFillStyle("#666666"); ctx.setFillStyle("#666666");
ctx.fillText("✖ 今日忌", 32 + boxW + 24 + 24, gridY + 40); ctx.font = "bold 24px sans-serif";
ctx.fillText("✖ 今日忌", 32 + boxW + 24 + 24, gridY + 44);
ctx.setFontSize(22); ctx.setFontSize(22);
ctx.font = "normal 22px sans-serif";
wrapText( wrapText(
ctx, ctx,
resultData.value.ji, resultData.value.ji,
32 + boxW + 24 + 24, 32 + boxW + 24 + 24,
gridY + 70, gridY + 80,
boxW - 48, boxW - 48,
30, 30,
); );
// 6. 幸运元素 // 6. 幸运元素
const elY = 540; const elY = 570; // 下移,避免与上面重叠
drawBox(ctx, 32, elY, W - 64, 120, "#fbfbfb", "#f5f5f5"); const elH = 160; // 增加高度
drawBox(ctx, 32, elY, W - 64, elH, "#fbfbfb", "#f5f5f5");
// 标题 // 标题
ctx.setFontSize(26); ctx.setFontSize(26);
ctx.setFillStyle("#333333"); ctx.setFillStyle("#333333");
ctx.fillText("★ 幸运元素", 56, elY + 40); ctx.font = "bold 26px sans-serif";
ctx.fillText("★ 幸运元素", 56, elY + 46);
// 元素内容 // 元素内容
const colW = (W - 64) / 3; const contentW = W - 64; // 内容区域总宽度
const valY = elY + 90; const colW = contentW / 3; // 三等分
const startX = 32; // 起始X坐标
// 颜色 // 调整Y坐标确保不重叠
const labelY = elY + 90;
const valY = elY + 126;
// 颜色 (第一列)
ctx.setTextAlign("center"); ctx.setTextAlign("center");
ctx.setFontSize(20); ctx.setFontSize(20);
ctx.setFillStyle("#999999"); ctx.setFillStyle("#999999");
ctx.fillText("颜色", 32 + colW * 0.5, elY + 60); ctx.font = "normal 20px sans-serif";
ctx.fillText("颜色", startX + colW * 0.5, labelY);
ctx.setFontSize(26); ctx.setFontSize(26);
ctx.setFillStyle("#d84315"); ctx.setFillStyle("#d84315");
ctx.font = "bold 26px sans-serif"; ctx.font = "bold 26px sans-serif";
ctx.fillText(resultData.value.luckyColor, 32 + colW * 0.5, valY); ctx.fillText(resultData.value.luckyColor, startX + colW * 0.5, valY);
// 数字 // 数字 (第二列)
ctx.setFontSize(20); ctx.setFontSize(20);
ctx.setFillStyle("#999999"); ctx.setFillStyle("#999999");
ctx.fillText("数字", 32 + colW * 1.5, elY + 60); ctx.font = "normal 20px sans-serif";
ctx.fillText("数字", startX + colW * 1.5, labelY);
ctx.setFontSize(26); ctx.setFontSize(26);
ctx.setFillStyle("#333333"); ctx.setFillStyle("#333333");
ctx.fillText(resultData.value.luckyNumber, 32 + colW * 1.5, valY); ctx.font = "bold 26px sans-serif";
ctx.fillText(resultData.value.luckyNumber, startX + colW * 1.5, valY);
// 方向 // 方向 (第三列)
ctx.setFontSize(20); ctx.setFontSize(20);
ctx.setFillStyle("#999999"); ctx.setFillStyle("#999999");
ctx.fillText("方向", 32 + colW * 2.5, elY + 60); ctx.font = "normal 20px sans-serif";
ctx.fillText("方向", startX + colW * 2.5, labelY);
ctx.setFontSize(26); ctx.setFontSize(26);
ctx.setFillStyle("#333333"); ctx.setFillStyle("#333333");
ctx.fillText(resultData.value.luckyDirection, 32 + colW * 2.5, valY); ctx.font = "bold 26px sans-serif";
ctx.fillText(resultData.value.luckyDirection, startX + colW * 2.5, valY);
// 分隔线 // 分隔线 1
ctx.setStrokeStyle("#eeeeee"); ctx.setStrokeStyle("#eeeeee");
ctx.setLineWidth(2);
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(32 + colW, elY + 30); const lineTop = elY + 70;
ctx.lineTo(32 + colW, elY + 90); const lineBottom = elY + 130;
ctx.moveTo(32 + colW * 2, elY + 30); ctx.moveTo(startX + colW, lineTop);
ctx.lineTo(32 + colW * 2, elY + 90); ctx.lineTo(startX + colW, lineBottom);
ctx.stroke();
// 分隔线 2
ctx.beginPath();
ctx.moveTo(startX + colW * 2, lineTop);
ctx.lineTo(startX + colW * 2, lineBottom);
ctx.stroke(); ctx.stroke();
// 7. 语录 // 7. 语录
@@ -330,7 +360,8 @@ const onSaveImage = () => {
ctx.setFontSize(22); ctx.setFontSize(22);
ctx.setFillStyle("#999999"); ctx.setFillStyle("#999999");
ctx.font = "italic 22px sans-serif"; ctx.font = "italic 22px sans-serif";
ctx.fillText(`${resultData.value.quote}`, W / 2, 720); // 语录换行处理,下移坐标
wrapTextCentered(ctx, `${resultData.value.quote}`, W / 2, 780, W - 80, 30);
// 8. 底部区域 (Footer) // 8. 底部区域 (Footer)
const footerY = 850; const footerY = 850;
@@ -435,6 +466,25 @@ function wrapText(ctx, text, x, y, maxWidth, lineHeight) {
ctx.fillText(line, x, y); ctx.fillText(line, x, y);
} }
// 辅助函数:文字换行(居中)
function wrapTextCentered(ctx, text, x, y, maxWidth, lineHeight) {
let words = text.split("");
let line = "";
for (let n = 0; n < words.length; n++) {
let testLine = line + words[n];
let metrics = ctx.measureText(testLine);
let testWidth = metrics.width;
if (testWidth > maxWidth && n > 0) {
ctx.fillText(line, x, y);
line = words[n];
y += lineHeight;
} else {
line = testLine;
}
}
ctx.fillText(line, x, y);
}
const onShareMoments = () => { const onShareMoments = () => {
uni.showToast({ title: "请点击右上角分享", icon: "none" }); uni.showToast({ title: "请点击右上角分享", icon: "none" });
}; };