Files
jindengchen-ai-report/cool-unix/pages/demo/other/canvas.uvue
2025-11-13 10:36:23 +08:00

234 lines
4.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<cl-page>
<cl-canvas
v-if="width > 0"
ref="canvasRef"
canvas-id="test"
:height="height"
:width="width"
@load="onCanvasLoad"
></cl-canvas>
<cl-footer>
<!-- #ifdef H5 -->
<cl-button type="primary" @click="previewImage">{{ t("预览图片") }}</cl-button>
<!-- #endif -->
<!-- #ifndef H5 -->
<cl-button type="primary" @click="saveImage">{{ t("保存图片") }}</cl-button>
<!-- #endif -->
</cl-footer>
</cl-page>
</template>
<script lang="ts" setup>
import { t } from "@/locale";
import { Canvas } from "@/uni_modules/cool-canvas";
import { useUi } from "@/uni_modules/cool-ui";
import { ref } from "vue";
const ui = useUi();
const canvasRef = ref<ClCanvasComponentPublicInstance | null>(null);
// 初始化为 0避免页面未完全渲染时 getWindowInfo 获取到的高度或宽度不准确(如已知固定高宽可直接赋值)
const height = ref(0);
const width = ref(0);
function onCanvasLoad(canvas: Canvas) {
canvas
.image({
x: 0,
y: 0,
width: width.value,
height: height.value,
url: "/static/demo/canvas/bg.png"
})
.image({
x: 0,
y: 0,
width: width.value,
height: height.value,
url: "/static/demo/canvas/light.png"
})
.image({
x: (width.value - 226) / 2,
y: 60,
width: 226,
height: 77,
url: "/static/demo/canvas/text-yqhy.png"
})
.image({
x: (width.value - 325) / 2,
y: 125,
width: 325,
height: 77,
url: "/static/demo/canvas/text-dezk.png"
})
.image({
x: (width.value - 196) / 2,
y: 190,
width: 196,
height: 62,
url: "/static/demo/canvas/text-xrfl.png"
})
.image({
x: (width.value - 374) / 2 - 1,
y: 500,
width: 374,
height: 220,
url: "/static/demo/canvas/rp-t.png"
})
.image({
x: (width.value - 327) / 2,
y: 280,
width: 327,
height: 430,
url: "/static/demo/canvas/bg-content.png"
})
.image({
x: 30,
y: 240,
width: 114,
height: 120,
url: "/static/demo/canvas/gold-l.png"
})
.image({
x: width.value - 106 - 50,
y: 240,
width: 106,
height: 107,
url: "/static/demo/canvas/gold-r.png"
})
.image({
x: (width.value - 350) / 2,
y: 595,
width: 350,
height: 122,
url: "/static/demo/canvas/rp-b.png"
})
.image({
x: (width.value - 208) / 2,
y: 631,
width: 208,
height: 89,
url: "/static/demo/canvas/invite-btn.png"
})
.div({
x: (width.value - 276) / 2,
y: 335,
width: 276,
height: 210,
backgroundColor: "#fff",
radius: 10
})
.text({
x: 0,
y: 350,
width: width.value,
content: "新人专享",
color: "#F73035",
textAlign: "center",
fontSize: 28,
fontWeight: "bold"
})
.text({
x: 0,
y: 390,
width: width.value,
content: "限时领券30元",
color: "#F73035",
textAlign: "center",
fontSize: 16
})
.image({
x: (width.value - 246) / 2,
y: 432,
width: 246,
height: 98,
url: "/static/demo/canvas/coupon.png"
})
.text({
x: (width.value - 246) / 2,
y: 435,
content: "领券",
width: 34,
color: "#fff",
fontSize: 11,
textAlign: "center"
})
.text({
x: (width.value - 246) / 2,
y: 454,
width: 86,
content: "80",
color: "#604E44",
fontSize: 46,
textAlign: "center",
fontWeight: "bold"
})
.text({
x: (width.value - 246) / 2 + 86,
y: 459,
width: 246 - 86,
content: "新人专享优惠券",
color: "#604E44",
fontSize: 18,
textAlign: "center"
})
.text({
x: (width.value - 246) / 2 + 86,
y: 489,
width: 246 - 86,
content: "2021.04.30-2021.06.30",
color: "#604E44",
fontSize: 12,
textAlign: "center"
})
.text({
x: 0,
y: 560,
width: width.value,
content: "邀请好友双方均可获得20元优惠券",
color: "#756056",
fontSize: 15,
textAlign: "center"
})
.text({
x: 0,
y: 300,
width: width.value,
content: " 专属新人福利 ",
color: "#956056",
textAlign: "center",
opacity: 0.7
})
.draw();
}
function previewImage() {
canvasRef.value!.previewImage();
}
function saveImage() {
canvasRef.value!.saveImage();
}
onReady(() => {
// 同上
height.value = uni.getWindowInfo().windowHeight;
width.value = uni.getWindowInfo().windowWidth;
ui.showConfirm({
title: t("提示"),
message: t("本页面内容由 canvas 渲染生成,是否立即预览图片效果?"),
confirmText: t("预览"),
callback(action) {
if (action == "confirm") {
canvasRef.value!.previewImage();
}
}
});
});
</script>