微信小程序:一个 json 帮你完成分享朋友圈图片 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kuckboy
V2EX    微信

微信小程序:一个 json 帮你完成分享朋友圈图片

  •  
  •   kuckboy 2018-07-13 17:05:20 +08:00 1959 次点击
    这是一个创建于 2720 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写在前面

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

    演示

    image

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

    image

    特性

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

    体验

    git clone https://user-gold-cdn.xitu.io/2018/7/13/16491baf33e98a98 

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

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

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

    使用

    • git clone https://user-gold-cdn.xitu.io/2018/7/13/16491baf33e98a98 到本地
    • components 中的 canvasdrawer 拷贝到自己项目下。
    • 在使用页面注册组件
      { "usingComponents": { "canvasdrawer": "/components/canvasdrawer/canvasdrawer" } } 
    • 在页面 **.wxml 文件中加入如下代码
      <canvasdrawer painting="{{painting}}" bind:getImage="eventGetImage"/> 
      painting 是需要传入的 jsongetImage 方法是绘图完成之后的回调函数,在 event.detail 中返回绘制完成的图片地址。
    • 当前栗子中的 painting 简单展示一下。详细配置请看 API

    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 } ] } 

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

    当前可以绘制 3 种类型的配置: imagetextrect。配置的属性基本上使用的都是 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

    1. 最佳实践

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

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

      绘制完成之后

      wx.hideLoading() 

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

    2. 二维码和小程序码如何绘制?

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

      • views 数组中的顺序代表绘画的先后顺序,会有覆盖的现象。请各位使用者注意。
    4. 如何实现圆形头像?

      • canvas 中没有绘制圆形图片的方法,所以使用了 hack 的方式来实现的。使用一张中间镂空的图片盖在头像上就可实现当前效果。
    5. canvas drawer 组件为什么不直接显示 canvas 画板和其内容呢?

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

    TIPS

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

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

    1 条回复    2018-07-13 17:36:33 +08:00
    CDuXZMAPgHp1q9ew
        1
    CDuXZMAPgHp1q9ew  
       2018-07-13 17:36:33 +08:00
    666
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5318 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 09:15 PVG 17:15 LAX 01:15 JFK 04:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86