绘制流程
布局定义
在我们的布局里要声明canvas的定义如下,可以声明class布局样式,width和height是必须的,因为如果没有就绘制不了。
canvas-id也是必须的,我们需要通过id找到对一个你的canvas对象,来做操作
<canvas class="poster_canvas" canvas-id="mini_poster":style="{ width: canvasW + 'px', height: canvasH + 'px' }">
</canvas>
绘制背景图
所有绘制操作都要通过createCanvasContext创建好canvas对象来进行, 这里this.bgShareInvite 是一个图片url,这里是获取到图片的信息,然后通过 drawImage 绘制出来 参数需要绘制的坐标(x,y)和绘制的图片宽高。
let ctx = uni.createCanvasContext('mini_poster', this)
let info = await uni.getImageInfo({src: this.bgShareInvite
})
console.log('info:', info[1]);
//绘制背景图
ctx.drawImage(info[1].path, 0, 0, this.canvasW, this.canvasH)
绘制背景
可以绘制各种底色的背景,带圆角或者不带!这里建议封装好2个方法,如下,然后在对应界面引用,传入我们需要的参数来调用。
const roundedRect = (ctx, x, y, width, height, radius) => {
ctx.moveTo(x + radius, y);
ctx.arcTo(x + width, y, x + width, y + height, radius);
ctx.arcTo(x + width, y + height, x, y + height, radius);
ctx.arcTo(x, y + height, x, y, radius);
ctx.arcTo(x, y, x + radius, y, radius);
}
export const drawRoundedRect = (ctx, strokeStyle, fillStyle, x, y, width, height, radius) => {
ctx.beginPath();
roundedRect(ctx, x, y, width, height, radius);
ctx.strokeStyle = strokeStyle;
ctx.fillStyle = fillStyle;
ctx.stroke();
ctx.fill();
}
//绘制圆角矩形
let bgWhiteW = 484
let bgWhiteH = 604
let radius = 20
drawRoundedRect(ctx, '#ffffff', '#ffffff', 20, 20, bgWhiteW, bgWhiteH, radius)
绘制本地图片
这个没什么特别,跟绘制网络图片的差别在于,不需要在获取图片的信息了,直接传递图片路径作为参数,可以直接绘制。
//绘制内部背景logo
let bgLogoW = 336
let bgLogoH = 142
let bgLogoX = this.canvasW / 2 - bgLogoW / 2
let bgLogoY = 70
ctx.drawImage('../../static/image/bg-login-tips.png', bgLogoX, bgLogoY, bgLogoW, bgLogoH)
绘制文字
主要注意2个api的使用,一个是measureText,测量文字的宽度。
一个是fillText绘制文字,参数传对应的文字坐标。同时注意的还有textAlign方法,这个是设置文字的绘制位置是中心还是左侧、右侧,以x坐标为标准,绘制的起始点在中心、左侧、右侧三个选项。
let tips = '仅限受邀用户才能参加内购活动'
let tipsW = ctx.measureText(tips).width
let bottomTvX = this.canvasW / 2
let bottomTvY = 85;
const fz30 = uni.$u.getPx('32rpx')
ctx.fillStyle = '#333333'
ctx.textAlign = "center"
ctx.setFontSize(fz30)
ctx.fillText(tips, bottomTvX, bottomTvY)
总结
基本上绘制海报的流程,都是用到以上几个api的结合,可以绘制出我们想要的效果。其中要根据设计稿的排版来进行坐标的设置,然后做好划分,先绘制哪一部分,在绘制下一部分,做好划分,一定能绘制出想要的效果!
最后
整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。
有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享
部分文档展示:
文章篇幅有限,后面的内容就不一一展示了
有需要的小伙伴,可以点下方卡片免费领取