微信小程序通过一个json实现分享朋友圈图片


Posted in Javascript onSeptember 03, 2019

写在前面

最近在做小程序,发现制作分享到朋友圈图片是每个项目必须的。遇到坑比较多,写起来也比较繁琐,也没有找到类似组件,所以就自己动手写了一个。

演示

微信小程序通过一个json实现分享朋友圈图片

左侧是 canvasdrawer 绘制的,右侧是UI给的图

微信小程序通过一个json实现分享朋友圈图片

特性

  • 简单易用 —— 一个 json 搞定绘制图片
  • 功能全 —— 满足 90% 的使用场景
    • 绘制文本(换行、超出内容省略号、中划线、下划线、文本加粗)
    • 绘制图片
    • 绘制矩形
    • 保存图片
    • 多图绘制
    • ...
  • 代码量小

体验

git clone https://github.com/kuckboy1994/mp_canvas_drawer

想在手机上使用配置自己的 appid 即可。

编译模式中已经为你配置好比较常用的两种模式:

  • 普通绘制,绘制单张分享图。
  • 多图绘制,连续绘制分享图

使用

git clone https://github.com/kuckboy1994/mp_canvas_drawer 到本地

把 components 中的 canvasdrawer 拷贝到自己项目下。

在使用页面注册组件

{
 "usingComponents": {
 "canvasdrawer": "/components/canvasdrawer/canvasdrawer"
 }
}

在页面 **.wxml 文件中加入如下代码

<canvasdrawer painting="{{painting}}" bind:getImage="eventGetImage"/>

painting 是需要传入的 json。 getImage 方法是绘图完成之后的回调函数,在 event.detail 中返回绘制完成的图片地址。

当前栗子中的 painting 简单展示一下。详细配置请看 API

painting

{
 width: 375,
 height: 555,
 views: [
 {
 type: 'image',
 url: 'https://hybrid.xiaoying.tv/miniprogram/viva-ad/1/1531103986231.jpeg',
 top: 0,
 left: 0,
 width: 375,
 height: 555
 },
 {
 type: 'image',
 url: 'https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83epJEPdPqQVgv6D8bojGT4DrGXuEC4Oe0GXs5sMsN4GGpCegTUsBgL9SPJkN9UqC1s0iakjQpwd4h4A/132',
 top: 27.5,
 left: 29,
 width: 55,
 height: 55
 },
 {
 type: 'image',
 url: 'https://hybrid.xiaoying.tv/miniprogram/viva-ad/1/1531401349117.jpeg',
 top: 27.5,
 left: 29,
 width: 55,
 height: 55
 },
 {
 type: 'text',
 content: '您的好友【kuckboy】',
 fontSize: 16,
 color: '#402D16',
 textAlign: 'left',
 top: 33,
 left: 96,
 bolder: true
 },
 {
 type: 'text',
 content: '发现一件好货,邀请你一起0元免费拿!',
 fontSize: 15,
 color: '#563D20',
 textAlign: 'left',
 top: 59.5,
 left: 96
 },
 {
 type: 'image',
 url: 'https://hybrid.xiaoying.tv/miniprogram/viva-ad/1/1531385366950.jpeg',
 top: 136,
 left: 42.5,
 width: 290,
 height: 186
 },
 {
 type: 'image',
 url: 'https://hybrid.xiaoying.tv/miniprogram/viva-ad/1/1531385433625.jpeg',
 top: 443,
 left: 85,
 width: 68,
 height: 68
 },
 {
 type: 'text',
 content: '正品MAC魅可口红礼盒生日唇膏小辣椒Chili西柚情人',
 fontSize: 16,
 lineHeight: 21,
 color: '#383549',
 textAlign: 'left',
 top: 336,
 left: 44,
 width: 287,
 MaxLineNumber: 2,
 breakWord: true,
 bolder: true
 },
 {
 type: 'text',
 content: '¥0.00',
 fontSize: 19,
 color: '#E62004',
 textAlign: 'left',
 top: 387,
 left: 44.5,
 bolder: true
 },
 {
 type: 'text',
 content: '原价:¥138.00',
 fontSize: 13,
 color: '#7E7E8B',
 textAlign: 'left',
 top: 391,
 left: 110,
 textDecoration: 'line-through'
 },
 {
 type: 'text',
 content: '长按识别图中二维码帮我砍个价呗~',
 fontSize: 14,
 color: '#383549',
 textAlign: 'left',
 top: 460,
 left: 165.5,
 lineHeight: 20,
 MaxLineNumber: 2,
 breakWord: true,
 width: 125
 }
 ]
}

API

对象结构一览

{
 width: 375,
 height: 555,
 views: [
 {
 type: 'image',
 url: 'url',
 top: 0,
 left: 0,
 width: 375,
 height: 555
 },
 {
 type: 'text',
 content: 'content',
 fontSize: 16,
 color: '#402D16',
 textAlign: 'left',
 top: 33,
 left: 96,
 bolder: true
 },
 {
 type: 'rect',
 background: 'color',
 top: 0,
 left: 0,
 width: 375,
 height: 555
 }
 ]
}

数据对象的第一层需要三个参数: width、height、views。配置中所有的数字都是没有单位的。这就意味着 canvas 绘制的是一个比例图。具体显示的大小直接把返回的图片路径放置到 image 标签中即可。

当前可以绘制3种类型的配置: image、text、rect。配置的属性基本上使用的都是 css 的驼峰名称,还是比较好理解的。

image(图片)

属性 含义 默认值 可选值
url 绘制的图片地址,可以是本地图片,如:/images/1.jpeg
top 左上角距离画板顶部的距离
left 左上角距离画板左侧的距离
width 要画多宽 0
height 要画多高 0

text(文本)

属性 含义 默认值 可选值
content 绘制的图片地址 ''(空字符串)
color 颜色 black
fontSize 字体大小 16
textAlign 文字对齐方式 left center、right
lineHeight 行高,只有在多行文本中才有用 20
top 文本左上角距离画板顶部的距离 0
left 文本左上角距离画板左侧的距离 0
breakWord 是否需要换行 false true
MaxLineNumber 最大行数,只有设置 breakWord: true ,当前属性才有效,超出行数内容的显示为... 2
width 和 MaxLineNumber 属性配套使用,width 就是达到换行的宽度
bolder 是否加粗 false true
textDecoration 显示中划线、下划线效果 none underline(下划线)、line-through(中划线)

rect (矩形,线条)

属性 含义 默认值 可选值
background 背景颜色 black
top 左上角距离画板顶部的距离
left 左上角距离画板左侧的距离
width 要画多宽 0
height 要画多高 0

Q&A

最佳实践

绘制操作的时候最好 锁住屏幕 ,例如在点击绘制的时候

wx.showLoading({
 title: '绘制分享图片中',
 mask: true
})

绘制完成之后

wx.hideLoading()

具体可以参考项目下的 /pages/multiple

1、二维码和小程序码如何绘制?

  • 二维码和小程序码可以通过调用微信官方的接口产生,需要后端配合。
  • 然后走 type: image 类型进行绘制即可。

2、绘制流程相关

  • views 数组中的顺序代表绘画的先后顺序,会有覆盖的现象。请各位使用者注意。

3、如何实现圆形头像?

  • canvas 中没有绘制圆形图片的方法,所以使用了 hack 的方式来实现的。使用一张中间镂空的图片盖在头像上就可实现当前效果。

4、canvas drawer 组件为什么不直接显示canvas画板和其内容呢?

  • 考虑到大部分场景,我们都是用来把图片保存到本地,或用以展示。
  • 保存到本地,返回临时文件给调用者一定是最佳的解决方式。
  • 展示,转化成图片之后,就可以使用 image 基础组件的所有显示模式了,还能设置宽高。

TIPS

如果有什么疑问,欢迎 issues。 如果觉得不错,能不能送我小 ✨ ✨ ,然我有更多的动力更新。

github:github.com/kuckboy1994…

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Valerio 发布了 Mootools
Sep 23 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
Oct 20 Javascript
jquery live()调用不存在的解决方法
Feb 26 Javascript
javascript实现类似java中getClass()得到对象类名的方法
Jul 27 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
Sep 24 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
Jun 23 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
Dec 14 Javascript
javascript读取文本节点方法小结
Dec 15 Javascript
关于Vue.nextTick()的正确使用方法浅析
Aug 25 Javascript
JS扩展String.prototype.format字符串拼接的功能
Mar 09 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
Sep 07 Javascript
JS实现小星星特效
Dec 24 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 #Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 #Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
Sep 03 #Javascript
Layui 动态禁止select下拉的例子
Sep 03 #Javascript
解决Layui中layer报错的问题
Sep 03 #Javascript
Layui Table js 模拟选中checkbox的例子
Sep 03 #Javascript
element ui分页多选,翻页记忆的实例
Sep 03 #Javascript
You might like
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
php HTML无刷新提交表单
2016/04/05 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
python列表去重的二种方法
2014/02/14 Python
python实现图片批量剪切示例
2014/03/25 Python
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
党员承诺书怎么写
2014/05/20 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
2015大学生实训报告
2014/11/05 职场文书
委托证明范本
2014/11/25 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书