1.0.2 • Published 2 years ago

duducanvas v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

Duducanvas 小程序canvas对象化封装, 微信小程序海报生成


举个栗子

image

image

image

image


uniapp vue2.0

image

uniapp vue3.0

image

整个目录可以用 “微信开发者工具” 直接打开

—— 根目录
———— mp 微信小程序目录
———— uniapp-vue3.0 demo 目录
———— uniapp-vue2.0 demo 目录
———— dist Duducanvas 编译后文件

==================================================

duducanvas 使用

==================================================

快速开始


页面内添加 canvas 标签
  <canvas id="myCanvas" canvas-id="myCanvas" style="width: 375px; height: 800px"></canvas>

创建舞台

import { Stage } from 'duducanvas.js'
new Stage('#myCanvas', stage => {
  // 此处开始逻辑写代码
})

!!如果是在自定义组件内则需要传 this 组件实例

import { Stage } from 'duducanvas.js'
new Stage('#myCanvas', stage => {
  // 此处开始逻辑写代码
}, this)
添加图片
  // 从 duducanvas 引入使用到的类
  import { ImgLoader, Stage, Image} from 'duducanvas.js'
  
  // 如果有图片先加载图片
  new ImgLoader([{
        id: 'avatar',
        src: '/image/132.jpeg'
      }
  ])
  .then((loader) => {
    // 通过页面中的 id 新建 Stage 舞台, 所有可视对象 (DisplayObject) 都将绘制在舞台
    new Stage('#myCanvas', stage => {
      // 添加图片,
      const avatar = new Image({
        image: loader.get('avatar'),
        width: 100, 
        height: 100,
      })
      // 将头像变成圆形
      avatar.borderRadius = '100%'
      
      // 添加至舞台
      stage.addChild(img)
    }, this)
  })
添加文本
import { Stage, Text } from 'duducanvas.js'
new Stage('#myCanvas', stage => {
  const t1 = new Text()
  t1.text = '你好世界Hello'
  t1.color = 'red'
  t1.x = 100
  t1.y = 300
  // 添加至舞台
  stage.addChild(t1)
})
添加形状
  const shape = new Shape()
  shape.graphics.fillStyle('green')
  shape.graphics.fillCircle(160, 160, 40)
  stage.addChild(shape)
Shape内可以画多个图形形状
  const muliShape = new Shape()
  muliShape.graphics
  .fillStyle('red')
  .fillRect(10, 110, 100, 50)
  .fillStyle('yellow')
  .fillCircle(10, 180, 30, 40)
  .fillStyle('green')
  .fillRect(10, 220, 40, 20)
  stage.addChild(muliShape)
获取 context 直接操作 canvas
如果封装的 api 无法满足业务需求,可直接操作 context 手动绘制
  new Stage('#myCanvas', (stage, context) => {
    context.fillStyle = 'blue'
    context.fillRect(50, 100, 100, 100)
  })
重新渲染舞台
异步添加的元素,需要手动调用 stage.update 方法
  // 重新渲染舞台
  stage.update()

  • ImgLoader 图片加载
  • Stage 舞台
  • DisplayObject 显示对象
  • Container 容器
  • Group 组
  • Image 图片
  • Shape 形状
  • Sprite 特殊图像
  • Text 文本

注意事项

  • Shape 类没有没有自动计算 width 与 height 属性,如有需要可自行主动设置
  • Group 类没有自动计算 width 与 height 属性,可通过实例方法 getBound 获取 {left, top, right, bottom}
  • flex 只实现了简单的布局功能,并未完全实现 flex 功能,flex完全体非常复杂,用都还没用明白
  • Canvas 暂时还未使用 Canvas 2D(新接口)

小程序 canvas 海报生成注意事项


  • 网络图片必须先通过 getImageInfo 下载后才能绘制
  • 微信头像需要下载后上传至自己的服务器绘制,直接使用微信服务器上的头像绘制时某些 Android 机型上会下载超时导致绘制失败
  • canvas page页面下不能嵌在Component组件内,否则某些机型会导致绘制失败
  • canvas 不能像h5中的canvas那样通过style来缩小,所以为了生成海报不模糊必须将 canvas 至少设置放大两倍,然后将canvas通过 css position 负值移到屏幕外,绘制后可以直接通过image标签来实现预览

关于添加 UI 事件的纠结


一直在纠结要不要为这个库添加 ui 事件,纠结的理由:

  • 小程序框架js运行层与 view 渲染层完全分离的,用户操作行为触发事件需要通过中转才能到达 view 渲染层,一旦用到 touchmove 频繁操作 UI 的事件就会明显的性能下降顿挫
  • 添加上了事件不就完全成了小游戏了么,那干麻不直接用小游戏框架
  • 调研了一圈发现添加UI事件比较好的方案需要由 2 个 canvas 来实现,小程序不像 web 那样方便,新版canvas-2d 完全成熟了的话再考虑

资料参考

rollup 构建

rollup版本 v2.58.1

rollup -c rollup.config.js