fix: lucky page
This commit is contained in:
@@ -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" });
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user