Painter是由酷家乐移动前端团队打造的一款小程序绘图组件。

原项目地址:https://github.com/Kujiale-Mobile/Painter

新版地址:https://github.com/shesw/Painter

这款交互版原来是为了针对业务中的新需求而由我自己开发的,后来需求改动,所以并没有用上。组里大佬考虑种种原因(主要是项目没用上,=0=~~),让我先在自己的github上开源。这版painter与原版的区别在于:

  1. 添加了交互事件。Painter本质是以canvas为基础的,小程序的canvas有许多限制。允许canvas上元素的交互点击事件,可以实现更为便捷的功能,比如原来需要在canvas上添加功能按钮,现在可以直接画在canvas上
  2. 添加拖拽元素的功能。目前这个功能没有完善好,因为它的滑动动作会与小程序的全屏滑动事件冲突,因此,拖拽功能在固定的页面上效果才好,如在拖拽时设置overflow: hidden等。
这里将新版的Painter称为dancing-painter。引入方式请参考readme和demo。

演示:


主要功能:

指原版的painter的功能。这些功能依然是本项目的主(实)要(用)功能。

简介:

原版的使用简介请参见 https://juejin.im/post/5b40b158e51d4518f543c7b0

简单来讲,使用过程如下图所示,可以结合demo来看:


距离首次开源Painter库已经有一段时间了,这期间获益于各路道友的帮助和提点,Painter进行了几波更新(原项目地址):

新增特性:
  1. 增加align属性,可以使任意元素可以实现左中右对齐。
  2. 加入文字换行的能力。对一段文字设置width或者maxLines,都有可能触发文字的换行。
  3. 添加文字的一些属性:fontWeight, textDecoration, textStyel(fill, stroke), maxLines, lineHeight
  4. 图片mode属性,实现图片裁剪、缩放,默认为aspectFill
  5. 图片不设置width, heighti属性,使用默认宽高
  6. left, right, top, bottom对负数的支持
修复问题:
  1. 某些机型上切边会出现黑线。
  2. 安卓机型上圆角无法显示
  3. 使用文件前检查文件是否正常
  4. 二维码大小显示异常

交互功能:

这一版的特色主要是具备元素的点击事件实现以及拖拽功能,做出来以后因为项目上暂时用不上,所以感觉功能上可能比较鸡肋。不过还蛮好玩的?

在demo中称之为dancing-painter。

**强调:**要使用交互功能,有一下两点需要注意:

  1. 导入palette时,使用绝对路径方法导入
  2. palette类,以module.exports输出。

原因:小程序页面向组件传值时,会把对象参数做一个类似于JSON.parse(JSON.stringfy())的拷贝,导致对象中的函数在传递后丢失。因此在dancing-painter中,选择讲palette(即生成图片的json代码)的路径传递给painter组件,在组件内require到这个文件,再合成所需的json数据。

导入代码如下:

    //直接导入数据// const template = new DCard().palette(); //导入绝对路径const template = {path: '/palette/dancing-card.js',data: {},};this.setData({template: template,});

palette:

//位于/palette/dancing-card.js
class PaletteCard {context = {}constructor(data) {this.data = data;}palette() {return{...}}
}
module.exports = PaletteCard;
实现点击效果

Painter的元素绘制是以json的形式给出的,其交互行为和拖拽效果也定义在相应的json文件里。

在需要设定某一个元素的点击事件的时候,只需要在其相应的json代码里加入methods属性即可。该属性支持一下几种点击方式:

name description
tap 点击
longpress 长按
touchstart 开始触摸
touchmove 移动
touchend 触摸结束

每一个方法可以返回一个boolean值,以表示是否拦截该事件。在dancing-painter中,如果在页面上元素有重叠,则方法的传递默认是由下而上的;在任意一个元素的methods方法中,可以返回true来拦截该事件。

使用拖拽功能

使用animation属性,目前只支持拖拽能力。由于存在与屏幕的滑动冲突(如果有大神知道怎么截获屏幕的滑动事件,如长页面的滚动,请千万不吝赐教告诉我哈),需要在使用时固定住整个页面,如设置overflow: hidden。

使用:设置animation:{drag:true}

示例:
{width: '700rpx',height: '1000rpx',background: '#eee',views: [{type: 'qrcode',content: 'https://github.com/Kujiale-Mobile/Painter',css: {top: '40rpx',left: '180rpx',color: 'red',borderWidth: '10rpx',borderColor: 'blue',width: '120rpx',height: '120rpx',align: 'center',},methods: {tap() {console.log('qrcode');},}},{type: 'rect',css: {top: '40rpx',left: '180rpx',color: 'green',borderRadius: '20rpx',borderWidth: '10rpx',width: '120rpx',height: '120rpx',},methods: {tap() {// 调用当前页面的function方法const pages = this.getCurrentPages();const currentPage = pages[pages.length-1];currentPage.function();},},animation: {drag: true,},}]
}
事件冒泡

事件默认是冒泡传递的。示例如下:

上面的代码中是两个部分重叠的二维码和方形:


点击二者的重合部分,控制台输出:


性能

拖拽功能是一种动画现象,涉及到canvas的重绘。经过测试,在IDE上重绘速度很快,在真机上有数量级的差别。

动画效果的连贯性主要是由canvas.draw()的速度决定的。

下图展示了在demo主页上,canvas.draw()方法在ide和真机上运行的时间差别(单位:ms):

IDE: 真机(华为荣耀8):



结语

感谢大佬在开发中对我的无限帮助。

感谢 demi520 的 wxapp-qrcode 库,Painter 中二维码绘制部分使用了该库的部分代码,并做了些修改。

另外这里有一篇wiki简单介绍了怎样在mpvue中使用Painter。

坑::mpvue在更新某一个页面元素的值的时候,会同时把所有data中存在的元素都更新一遍。

这就造成了这个问题:Painter绘制完成后,会触发onImgOK函数,传出图片的url。这时将该url传入某image的src中去,同时就会触发Painter的template的再赋值,从而导致无限重绘。

最后,作为程序员届的新手和菜鸟,诚邀各路大神用issue和建议砸死我?

最后,作为程序员届的新手和菜鸟,诚邀各路大神用issue和建议砸死我?

最后,作为程序员届的新手和菜鸟,诚邀各路大神用issue和建议砸死我?

demo传送门:https://github.com/shesw/Painter
使用参考(原版): https://juejin.im/post/5b40b158e51d4518f543c7b0

小程序绘图工具painter-json文件绘制保存分享图-可点击任意元素触发函数相关推荐

  1. 小程序错误:[app.json文件内容错误]app.json未找到

    问题描述: 在Github上刚刚拉取的代码,导入微信开发者工具打开之后出现如下问题, 解决办法: 1.我自己的原因是项目目录没打开对,打开目录的时候 .此文件夹的二级目录必须包含pages,style ...

  2. 小程序报错[ app.json 文件内容错误] app.json: app.json 未找到

    当你开发小程序出现这个报错说什么找不到app.json,但实际已经有了. 我百度了一阵找到了问题:微信web开发者工具在建立项目.添加项目时选择的项目目录的文件夹下不能有次级文件夹:若是有次级文件,即 ...

  3. 微信小程序使用html2canvas,微信小程序canvas 2d 引入本地图片并生成分享图

    在小程序基础库 v2.9.0 正式开放一套全新的 Canvas 接口.该接口符合 HTML Canvas 2D 的标准,实现上采用 GPU 硬件加速,渲染性能相比于现有的 Canvas 接口有一倍左右 ...

  4. 微信小程序-04-详解介绍.json 配置文件

    致我自己:小程序开发不是简单一两天的事,一两天只能算是了解,有时候看多了会烦,感觉很熟悉了,其实只是对表面进行了解,对编程却知之甚少,小程序开发不是简单的改模板,一两天很多部分改模板可能都做不到,坚持 ...

  5. 微信开发者工具无法选择预览和真机调试_小程序开发 第二篇:使用微信小程序开发者工具、wepy框架初始化项目...

    1.微信小程序开发者工具 使用: 小程序原生开发:直接使用小程序开发者工具打开项目即可 小程序框架开发:首选官方提供类vue.js开发框架 wepy.js ,备选 mpVue.我们选择的是 wepy ...

  6. 微信小程序: 微信小程序-开发者工具添加less插件

    在入门微信小程序的时候,在其他编译软件中有使用less插件的小伙伴都会发现,在微信小程序-    开发者工具中是没有下载插件这个入口的,所以我们可以借助vscode来辅助微信小程序-开发者工具安装le ...

  7. 微信小程序:工具配置 project.config.json

    微信小程序:工具配置 project.config.json 一.项目配置文件project.config.json 小程序开发者工具在每个项目的根目录都会生成一个 project.config.js ...

  8. 微信小程序开发工具 清除授权缓存/文件缓存/登录缓存等等

    今天2.19.3.25 在开发微信小程序时,作为测试号想清除授权缓存,一直没有找到方法, 最后无意中看到了解决方法 微信小程序开发工具 清除授权缓存/文件缓存/登录缓存等等.完美解决

  9. 小程序开发工具中黑马优购小程序tabs组件_别不信,二十一天巧妙精通微信小程序的开发,附赠教程...

    资料简介: 这是一本帮助编程爱好者和从业人员从零开始学习微信小程序设计的书.本书紧跟微信小程序的技术发展,是目前在该领域率先进行系统的技术探讨和培训的著作. 本书站在学习的角度,目的是让学习者通过21 ...

最新文章

  1. C# 文件流相关操作
  2. Python 只读属性的实现
  3. linux关闭的时候出现异常: java.net.ConnectException: 拒绝连接 (Connection refused)
  4. 架构模式: API网关
  5. mysql8.0认证方式修改
  6. Linux 虚拟机配置静态IP地址
  7. 单片机编程语言——C语言(2)
  8. 频登各大时装周运动品牌FILA在得物App首发和平精英联名系列
  9. 今日金融词汇---股价复权,是什么?
  10. 在英语语法的基础上分析荷兰语的一些语法点
  11. ios绘图教程(原文http://www.cocoachina.com/industry/20140115/7703.html)
  12. MVC.Net: 解决Attempted to access an unloaded appdomain的问题
  13. npm包发布正式和测试版
  14. 量化数值评估,查准率和召回率
  15. Sublime Text3 多行注释
  16. 云原生安全,这也是一道必答题
  17. java二维数组两种初始化方法
  18. 学习安卓开发第七天【网格视图qq相册页面】【下拉;列表框】【下拉列表框实例】【列表视图】
  19. M87 黑洞照片的捕捉背后,这个程序媛功不可没
  20. 设置随机种子的函数: srand(种子);的重要性

热门文章

  1. 2021高考厦门一中成绩查询,2021年厦门中考成绩和分数线什么时候公布(附查询入口)...
  2. 群晖备份linux分区,数据丢失的后悔药,群晖NAS备份方案详解
  3. 34个计算机网络易错知识点总结
  4. NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」
  5. Mac os下android studio模拟器无法联网解决方法
  6. 设置TextView为下划线的样式
  7. [转]在资源管理器中使鼠标右键增加一个命令,运行cmd,同时使得当前路径为资源管理器当前的目录...
  8. 很久没来了,嘿嘿 问候一下大家,O(∩_∩)O哈哈~
  9. jedis使用_Redis的三个框架:Jedis,Redisson,Lettuce
  10. VisualBasic 版 (精华区)