微信小程序通过一个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 相关文章推荐
jquery validate.js表单验证的基本用法入门
May 13 Javascript
jquery 笔记 事件
Nov 02 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
Dec 08 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
Aug 09 Javascript
原生javascript实现隔行换色
Jan 04 Javascript
jQuery手动点击实现图片轮播特效
Apr 20 Javascript
ES6教程之for循环和Map,Set用法分析
Apr 10 Javascript
vue数字类型过滤器的示例代码
Sep 07 Javascript
node实现基于token的身份验证
Apr 09 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
vue实现图片上传预览功能
Dec 23 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
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
javascript标签在页面中的位置探讨
2013/04/11 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
react-native封装插件swiper的使用方法
2018/03/20 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
django框架模板语言使用方法详解
2019/07/18 Python
python分布式计算dispy的使用详解
2019/12/22 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
《三峡》教学反思
2014/03/01 职场文书
公司员工离职证明书
2014/10/04 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
电影圆明园观后感
2015/06/03 职场文书