234 lines
4.4 KiB
Plaintext
234 lines
4.4 KiB
Plaintext
|
|
<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>
|