likes
comments
collection
share

不用懂canvas就可以快速完成小程序海报开发

作者站长头像
站长
· 阅读数 18

前言

之前在开发项目时需要实现微信小程序生成海报功能,刚开始打算用canvas进行实现,发现需要单独实现很多功能,比较麻烦,后来预研发现有个painter图片库,可以通过传入模板快速生成海报,使用起来简单高效。

不用懂canvas就可以快速完成小程序海报开发

接入准备

代码下载

首先我们需要去将核心实现代码拷贝到本地,打开代码我们会发现是小程序原生语言:

<view style='position: relative;{{customStyle}};{{painterStyle}}'>
  <block wx:if="{{!use2D}}">
    <canvas canvas-id="photo" style="{{photoStyle}};position: absolute; left: -9999px; top: -9999rpx;" />
    <block wx:if="{{dancePalette}}">
      <canvas canvas-id="bottom" style="{{painterStyle}};position: absolute;" />
      <canvas canvas-id="k-canvas" style="{{painterStyle}};position: absolute;" />
      <canvas canvas-id="top" style="{{painterStyle}};position: absolute;" />
      <canvas 
        canvas-id="front" 
        style="{{painterStyle}};position: absolute;"
        bindtouchstart="onTouchStart"
        bindtouchmove="onTouchMove"
        bindtouchend="onTouchEnd"
        bindtouchcancel="onTouchCancel"
        disable-scroll="{{true}}" />
      </block>
  </block>
  <block wx:if="{{use2D}}">
    <canvas type="2d" id="photo" style="{{photoStyle}};" />
  </block>
</view>

虽然也能在uniapp使用,但看着不是很顺眼,还是想统一vue实现方式。

代码转换

社区已经有大佬提供了相关插件转换小程序代码:

npm install miniprogram-to-uniapp -g

接着执行代码转换命令:

wtu -i ./painter -m

等待一会儿,代码便转换成功。

不用懂canvas就可以快速完成小程序海报开发

项目接入

组件引入

完成相关准备工作后,我们可以采用vue组件的方式引入到项目当中。前面转换成功以后会生成一个文件夹,包含多个文件,我们将vue文件和lib文件夹单独拷贝出来,并在项目中新建一个uniPainter组件文件夹,拷贝进去。

不用懂canvas就可以快速完成小程序海报开发

不用懂canvas就可以快速完成小程序海报开发 由于vue文件里还调用了setData方法,这个方法没有自动转换,我们需要将polyfill文件夹下mixins文件里的setData方法引入进来,可以采用mixins方式引入:

不用懂canvas就可以快速完成小程序海报开发

import setData from '/mixins/setData'
export default {
 mixins: [setData],
 ....
}

然后以组件方式在项目中引入:

<tempalte>
  <Painter :palette="canvasData" :LRU="true" @imgOK="onImgOK" @imgErr="onImgErr" widthPixels="800"></Painter>
</template>
<script>
import Painter from '@/components/uniPainter'

export default {
  components: {
    Painter
  },
  ...
  methods:
    onImgOK(e) {
     // 其中 e.detail.path 为生成的图片路径
    },
    // 海报生成失败
    onImgErr(e) {
      //
    }
  }
}
</script>

其中canvasData是模板文件,具体可参考painter图片库要求,采用如下格式:

{
  background: '#eee',
  width: '654rpx',
  height: '400rpx',
  borderRadius: '20rpx',
  views: [
  {
    type: 'image',
    url: 'https://qhyxpicoss.kujiale.com/r/2017/12/04/L3D123I45VHNYULVSAEYCV3P3X6888_3200x2400.jpg@!70q',
    css: {
      top: '48rpx',
      right: '48rpx',
      width: '192rpx',
      height: '192rpx',
    },
  }
  ...
  ]
}

图片清晰度可以设置widthPixels,但设置的越大,手机性能要求越高,否则会生成失败,开启LRU功能可以缓存网络下载的资源,避免重复下载,提高性能。

报错处理

完成前面工作以后,就可以在项目中运行啦,但是你会发现微信调试控制台有一大堆的vue warning:

不用懂canvas就可以快速完成小程序海报开发

不用懂canvas就可以快速完成小程序海报开发

其实从报错不难发现某些变量和方法出现问题,直接打开painter组件vue代码,通过搜索发现工具转换后的代码有一点问题,一些变量没有放到data下:

不用懂canvas就可以快速完成小程序海报开发

根据报错信息进行搜索修改以后,就可以完美解决warning报错问题,这下舒服了。

总结

以上就是uniapp小程序使用painter库的相关方案,我们只需要定义海报模板文件,就可以快速生成海报,提高开发效率。

转载自:https://juejin.cn/post/7216227563013537849
评论
请登录