• wxml-to-canvas
    • 使用方法
      • Step1. npm 安装,参考 小程序 npm 支持
      • Step2. JSON 组件声明
      • Step3. wxml 引入组件
      • Step4. js 获取实例
  • wxml 模板
  • 样式
  • 接口
    • f1. renderToCanvas({wxml, style}): Promise
    • f2. canvasToTempFilePath({fileType, quality}): Promise
  • 支持的 css 属性
    • 布局相关
    • 文字
    • 变形

    wxml-to-canvas

    小程序内通过静态模板和样式绘制 canvas ,导出图片,可用于生成分享图等场景。代码片段

    使用方法

    Step1. npm 安装,参考 小程序 npm 支持

    1. npm install --save wxml-to-canvas

    Step2. JSON 组件声明

    1. {
    2. "usingComponents": {
    3. "wxml-to-canvas": "wxml-to-canvas",
    4. }
    5. }

    Step3. wxml 引入组件

    1. <video class="video" src="{{src}}">
    2. <wxml-to-canvas class="widget"></wxml-to-canvas>
    3. </video>
    4. <image src="{{src}}" style="width: {{width}}px; height: {{height}}px"></image>

    Step4. js 获取实例

    1. const {wxml, style} = require('./demo.js')
    2. Page({
    3. data: {
    4. src: ''
    5. },
    6. onLoad() {
    7. this.widget = this.selectComponent('.widget')
    8. },
    9. renderToCanvas() {
    10. const p1 = this.widget.renderToCanvas({ wxml, style })
    11. p1.then((res) => {
    12. this.container = res
    13. this.extraImage()
    14. })
    15. },
    16. extraImage() {
    17. const p2 = this.widget.canvasToTempFilePath()
    18. p2.then(res => {
    19. this.setData({
    20. src: res.tempFilePath,
    21. width: this.container.layoutBox.width,
    22. height: this.container.layoutBox.height
    23. })
    24. })
    25. }
    26. })

    wxml 模板

    支持 viewtextimage 三种标签,通过 class 匹配 style 对象中的样式。

    1. <view class="container" >
    2. <view class="item-box red">
    3. </view>
    4. <view class="item-box green" >
    5. <text class="text">yeah!</text>
    6. </view>
    7. <view class="item-box blue">
    8. <image class="img" src="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3582589792,4046843010&fm=26&gp=0.jpg"></image>
    9. </view>
    10. </view>

    样式

    对象属性值为对应 wxml 标签的 cass 驼峰形式。需为每个元素指定 width 和 height 属性,否则会导致布局错误。

    存在多个 className 时,位置靠后的优先级更高,子元素会继承父级元素的可继承属性。

    元素均为 flex 布局。left/top 等 仅在 absolute 定位下生效。

    1. const style = {
    2. container: {
    3. width: 300,
    4. height: 200,
    5. flexDirection: 'row',
    6. justifyContent: 'space-around',
    7. backgroundColor: '#ccc',
    8. alignItems: 'center',
    9. },
    10. itemBox: {
    11. width: 80,
    12. height: 60,
    13. },
    14. red: {
    15. backgroundColor: '#ff0000'
    16. },
    17. green: {
    18. backgroundColor: '#00ff00'
    19. },
    20. blue: {
    21. backgroundColor: '#0000ff'
    22. },
    23. text: {
    24. width: 80,
    25. height: 60,
    26. textAlign: 'center',
    27. verticalAlign: 'middle',
    28. }
    29. }

    接口

    f1. renderToCanvas({wxml, style}): Promise

    渲染到 canvas,传入 wxml 模板 和 style 对象,返回的容器对象包含布局和样式信息。

    f2. canvasToTempFilePath({fileType, quality}): Promise

    提取画布中容器所在区域内容生成相同大小的图片,返回临时文件地址。

    fileType 支持 jpgpng 两种格式,quality 为图片的质量,目前仅对 jpg 有效。取值范围为 (0, 1],不在范围内时当作 1.0 处理。

    支持的 css 属性

    布局相关

    属性名支持的值或类型默认值
    widthnumber0
    heightnumber0
    positionrelative, absoluterelative
    leftnumber0
    topnumber0
    rightnumber0
    bottomnumber0
    marginnumber0
    paddingnumber0
    borderWidthnumber0
    borderRadiusnumber0
    flexDirectioncolumn, rowrow
    flexShrinknumber1
    flexGrownumber
    flexWrapwrap, nowrapnowrap
    justifyContentflex-start, center, flex-end, space-between, space-aroundflex-start
    alignItems, alignSelfflex-start, center, flex-end, stretchflex-start

    支持 marginLeft、paddingLeft 等

    文字

    属性名支持的值或类型默认值
    fontSizenumber14
    lineHeightnumber / string'1.4em'
    textAlignleft, center, rightleft
    verticalAligntop, middle, bottomtop
    colorstring#000000
    backgroundColorstringtransparent

    lineHeight 可取带 em 单位的字符串或数字类型。

    变形

    属性名支持的值或类型默认值
    scalenumber1