前言

大家好,我是《前端发现》。发现前端,发现技术,让前端变得更加容易。

实现海报?你想到的应该是html2canvas吧,但,这里是小程序,好像并不通用。只能用canvas一笔一划去描述了吗?答案肯定是不对的,今天介绍一个Painter插件,它可以帮助你快速完成小程序上的海报功能。

前期准备

github下载插件需要的文件。下载地址:[https://github.com/Kujiale-Mobile/Painter]。下载好找到文件里面的components/painter,复制整个painter文件夹,到你小程序项目的component目录下,若考虑该文件较大,可以采用分包的形式,将文件放入分包中。

组件形式使用插件

需要绘制海报的页面的.json中添加组件,或者在app.json中添加全局的组件。

{  "usingComponents": {   "painter":"./Components/painter/painter"}
}

绘制界面样式、数据

既然要绘制海报,我们必然需要准备好海报的内容。如:用到的文案、真实的数据、海报素材,包括视频文件、图片文件等等。

准备好以上东西我们需要将这些东西绘制在海报上,我们需要按照一定的格式才能更方便的绘制,而不是像canvas那样一点点去绘制。

这里推荐使用工具Painter海报生成Json工具 网站。因为使用painter插件可以让我们只要传输Json格式的数据给它,它就能帮我们绘制好页面。在网站内调整好布局后点击复制代码即可拷贝出如下Json格式的代码。

export default class LastMayday {palette(params) {return ({width: "750rpx",height: "1200rpx",background: "#FEF8F3",views: [{type: "image",url: `***/weapp/poster/poster_${params.posterNum}.jpg`,css: {width: "750rpx",height: "1200rpx",top: "0px",left: "0px",mode: "scaleToFill"}},{type: "image",url: `${params.avatar}`,css: {width: "100rpx",height: "100rpx",top: "124rpx",left: "64rpx",borderRadius: "100rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000",borderWidth:"1rpx",borderColor:"#fff"}},{type: "text",text: `${params.userName}`,css: {color: "#fff",width: "200rpx",top: "135rpx",left: "186rpx",fontSize: "32rpx",fontWeight: "bold",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `${params.className}`,css: {color: "#fff",width: "300rpx",top: "175rpx",left: "186rpx",fontSize: "30rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `大学习第${params.term}期`,css: {color: "#fff",width: "300rpx",top: "135rpx",left: "398rpx",fontSize: "30rpx",fontWeight: "bold",textAlign: "right",shadow:"4rpx 4rpx 6rpx #000"}},{type: "image",url: `${params.medalNum>=1?'***/weapp/badge/badge_1.png':''}`,css: {width: "96rpx",top: "280rpx",left: "86rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=2?'***/weapp/badge/badge_2.png':''}`,css: {width: "96rpx",top: "280rpx",left: "182rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=3?'***/weapp/badge/badge_3.png':''}`,css: {width: "96rpx",top: "280rpx",left: "278rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=4?***/weapp/badge/badge_4.png':''}`,css: {width: "96rpx",top: "280rpx",left: "374rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=5?'***/weapp/badge/badge_5.png':''}`,css: {width: "96rpx",top: "280rpx",left: "470rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "image",url: `${params.medalNum>=6?'*****/weapp/badge/badge_6.png':''}`,css: {width: "96rpx",top: "280rpx",left: "566rpx",mode: "scaleToFill",shadow:"2rpx 2rpx 4rpx #000"},},{type: "text",text: "完成率达到",css: {color: "#fff",width: "300rpx",top: "680rpx",left: "105rpx",fontSize: "40rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `${params.ratio}%`,css: {color: "#ff4000",width: "200rpx",top: "678rpx",left: "307rpx",fontSize: "44rpx",fontWeight: "bold",textAlign: "left",shadow: "1rpx 1rpx 2rpx #000"}},{type: "text",text: "速度超过了全国",css: {color: "#fff",width: "300rpx",top: "746rpx",left: "105rpx",fontSize: "40rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},{type: "text",text: `${params.classNum}`,css: {color: "#ff4000",width: "150rpx",top: "814rpx",left: "105rpx",fontSize: "46rpx",fontWeight: "bold",textAlign: "left",shadow: "1rpx 1rpx 2rpx #000"}},{type: "text",text: `个班级`,css: {color: "#fff",width: "400rpx",top: "818rpx",left: `${105+(params.classNum.toString().length)*30}rpx`,fontSize: "40rpx",textAlign: "left",shadow:"4rpx 4rpx 6rpx #000"}},]});}
}

我们在painter同级目录下新建一个paletle文件夹,然后在其下新建一个poster.js文件。如下:

这个文件就是用来处理数据和绘制海报的Js。

使用poster文件

在需要绘制海报的页面的.js中引用文件。

import Poster from '../../Components/palette/poster'

然后在你需要开始绘制海报的地方执行如下代码:

let posterParams = {avatar: this.data.avatar,userName: this.data.userName,className: this.data.className,term: this.data.term,ratio: this.data.ratio,classNum: this.data.classNum >= 100000 ? '10万+' : this.data.classNum,medalNum: this.data.medalNum,posterNum: this.data.currentIndex
}
wx.showToast({title: '海报绘制中',icon: 'loading',duration: 3000,
})
this.setData({paintPallette: new Poster().palette(posterParams),
});

可以看到,我们是通过new创建一个Poster实例,然后调用实例的方法palette,方法可以传一个对象,这个对象就是海报需要动态修改的数据。

使用组件

在需要绘制海报的页面的.wxml中使用组件。

<painter customStyle='position: absolute; left: -9999rpx;' palette="{{paintPallette}}" bind:imgOK="onImgOK" bind:imgErr="onImgErr"/>

其中customStyle:是插件支持的自定义样式,如果需要在海报绘制成功后不希望出现在页面上,可以采用如上的position: absolute; left: -9999rpx;

palette:是绘制海报内容的数据,可以传输从服务器返回过来的数据。

imgOK:是海报绘制成功后的回调,imgErr:是海报绘制失败的回调。

onImgOK(e) {that.setData({imagePath: e.detail.path,//绘制后的图片临时地址})
}

踩坑预警

1、使用Painter海报生成Json工具复制的代码会有一部分是没有用的,且加上会出错。

可以参考我上面的样式属性。需要用到其他样式属性的可以一点点加上查看效果。

2、绘制出来的海报很模糊。我们需要在绘制图片时加上设备的分辨率,代码在拷贝下来的painter.js,里面找到wx.canvasToTempFilePath...这句代码,绘制的宽高加上getApp().systemInfo.pixelRatio。如图:

欢迎补充…

微信小程序实现海报功能经历相关推荐

  1. 黯然微信小程序杂记(三):微信小程序实现倒计时功能 附讲解教学 附源码

    黯然微信小程序杂记(三):微信小程序实现倒计时功能 附超详细注释 附源码 一.功能描述 二.界面展示 三.test.wxml代码 四.test.js代码(注释很详细 很易懂) CSDN私信我,有关微信 ...

  2. 微信小程序实战 购物车功能

    代码地址如下: http://www.demodashi.com/demo/12400.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com ...

  3. 微信小程序实现语音识别功能

    原标题:微信小程序实现语音识别功能 使用小程序实现语音识别功能,由于语音识别可以直接使用各厂家的API接口,并且小程序为腾讯所有,因此考虑到可能的低延时,采用了腾讯提供的免费API接口,准确讲是腾讯语 ...

  4. 微信小程序语音识别java_微信小程序实现语音识别功能

    原标题:微信小程序实现语音识别功能 使用小程序实现语音识别功能,由于语音识别可以直接使用各厂家的API接口,并且小程序为腾讯所有,因此考虑到可能的低延时,采用了腾讯提供的免费API接口,准确讲是腾讯语 ...

  5. 微信小程序拼团功能页面展示

    微信小程序拼团功能页面展示 一.拼团功能 拼团就是让消费者在优惠价格的吸引下,自发邀请好友组团,以优惠的价格购买商品的促销活动 二.拼团功能的作用 1.与纯粹的购物相比,这种营销方式迎合了大多数用户的 ...

  6. 微信小程序原生开发功能合集一:微信小程序开发介绍

    一.专栏介绍   本专栏主要内容为微信小程序常用功能开发过程的介绍说明,包括开发微信小程序常用组件的封装.常用功能的开发等,提供源代码.开发过程讲解视频.完整的课程等.   组件封装: 下拉选择组件. ...

  7. IVX低代码平台开发——微信小程序实现抽奖功能

    写在前面 通过利用可视化编程实现微信小程序的抽奖功能,带大家初步了解 iVX 的强大之处. 文章目录 写在前面 iVX开发 抽奖功能实现 iVX开发 基本介绍 iVX是一个 "零代码&quo ...

  8. 微信小程序-001-抽签功能-006-我的抽签-主界面

    微信小程序-001-抽签功能-006-我的抽签-主界面 目录 一.wxml 二.js pages.chouqian.setqian.setqian 一.wxml <view wx:for=&qu ...

  9. 微信小程序与卡券功能小结

    微信小程序与卡券功能小结 前段时间公司有一个微信小程序的项目,其中有与卡券打通的功能,但是微信的官方文档实在是一言难尽...找了很多资料才解决这个问题,其中涉及到卡券的领取,卡券的核销等,在这里做一个 ...

  10. python玩微信小程序游戏_使用python实现微信小程序自动签到功能

    功能描述目标 完成多账号微信小程序每天自动签到 输出 签到成功则向微信群发送签到成功的信息 否则提示用户签到失败,需手动签到 包管理 requests itchat time threading 程序 ...

最新文章

  1. mysql学习笔记06分组语句的使用
  2. golang转义json字符串
  3. 奔跑吧火柴人c语言开发_小学数学智力题:这两个火柴棍趣味题,你能做出来吗?...
  4. android settheme不起作用,android-主题,样式和别名嵌套不起作用
  5. PHP 中 const define 的区别
  6. python面向对象——类(中)
  7. facade层,service 层,domain层,dao 层设计
  8. java实现消息推送_java实现后台服务器消息推送
  9. 蒙特卡洛_蒙特卡洛辍学
  10. 图片切换马赛克动画效果
  11. C语言中的找特殊数字问题
  12. 【刷题打卡】day7-BFS
  13. 数据结构-顺序表(动态分配存储空间)
  14. 判断两个数运算是否越界
  15. windows系统下安装深度系统deepin
  16. 【代码注释】浅谈对于代码注释的理解
  17. linux取证工具,【FastIR Collector Linux---让Linux取证更简单】
  18. :-1: error: collect2: error: ld returned 1 exit status
  19. 企业工信部备案提交教程(电子化备案)
  20. 类微信界面的制作-1 类微信app界面框架

热门文章

  1. github 下载慢下载失败?不存在的!!!
  2. 彩印包装印刷行业erp-轻松、易用
  3. Infor SyteLine ERP 安装后中文语言设置
  4. (二)XGBoost之DART booster
  5. DART booster
  6. Microsoft Visual SourceSafe 6.0 关联VS
  7. silvaco仿真遇到的bug和解决方案
  8. 【转载】ASP.Net请求处理机制初步探索之旅 - Part 3 管道
  9. Java开发WIN10动态壁纸
  10. OpenGL Mathematics (GLM)