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

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属性即可。该属性支持一下几种点击方式:

namedescription
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sweetalert php,SweetAlert插件

用户#姓名操作{% for user in all_user %}{{ forloop.counter }}{{ user.username }}编辑删除{% endfor %}var _thisthis;swal({title:"你确定要删除吗?",text:"删除可就找不回来了哦!",type:"warning",showCancelButton:…

python集合以及编码初识

一.集合 set 集合是无序的,天然能去重,是可变的.例:s {1,2,3,4,5}   1 s {} 2 s1 {1} 3 print(type(s)) # 空{}就是字典 4 print(type(s1)) #集合 集合的基本操作: 1.增 s {1,2,3,22,,ss,(3,4)} s.add(元素) s.update(alex) #迭代添加 alex会被分割添加 2.删 s…

JS 字符串操作总结

【MDN】https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String 【参考】https://www.cnblogs.com/guoyeqiang/p/8178336.html 字符串转换 1、toString() var age 11; var ageAsString age.toString(); //字符串“11” var found true;…

4 张动图解释为什么(什么时候)使用 Redux

dev-reading/fe 是一个阅读、导读、速读的 repo,不要依赖于 dev-reading/fe 学习知识。本 repo 只是一个快速了解文章内容的工具,并不提供全文解读和翻译。你可以通过本平台快速了解文章里面的内容,找到感兴趣的文章,然后去阅读全…

您正在使用什么垃圾收集器?

我们的研究实验室正全速前进。 随着最近的资金注入 ,我们只能保证我们不断创新的步伐只会加快。 我们进行的部分研究与GC优化有关。 在处理这个有趣领域中的问题时,我们认为可以分享一些有关GC算法使用的见解。 为此,我们对使用特定GC算法的…

基于混沌的图像置乱加密算法及matlab的实现,基于混沌的图像置乱加密算法及MATLAB的实现...

基于混沌的图像置乱加密算法及MATLAB的实现提出了一种基于混沌映射的图像置乱加密算法。借助MATLAB6.5软(本文共3页)阅读全文>>数字水印(Digital Watermark)技术属于国际上新兴的研究领域,其主要目的是为了实现数字作品的版权保护,将与作品内容相关或不相关的一些标示信息…

poj1857 To Europe! To Europe!

思路&#xff1a; 一维dp。 实现&#xff1a; 1 #include <cstdio>2 #include <iostream>3 using namespace std;4 const int INF 0x3f3f3f3f;5 int w[1005], v[1005], sum[1005];6 double dp[1005];7 int main()8 {9 int b, l, n; 10 while (cin >>…

前端布局推进剂 - 间距规范化

我是一个爱折腾设计的前端&#xff0c;一直都在标榜自己的页面还原是多么的牛 X 。怎么做到页面还原&#xff1f;我有一个最笨但是有效的方法&#xff0c;就是把设计稿直接存成图片&#xff0c;作为背景图然后临摹着设计稿进行开发。我觉得自己太有才了。像素级还原有没有&…

战略模式并不意味着春天!

是的&#xff0c;所以可以说您正在编写一个Spring MVC应用程序&#xff0c;然后您决定&#xff1a;“我想做一些单独的封装算法&#xff0c;这些算法可以互换来执行特定的行为”。 对此的经典回应是“您需要一个战略模式男孩&#xff01;”。 所以&#xff0c;这就是我所做的&…

echarts折线图相关

optionJKDLine {  title: {text: 告警数量趋势图,textStyle:{  //标题样式fontStyle:normal,fontFamily:sans-serif,fontSize:12    }},tooltip: {trigger: axis},legend: {  //图例,默认显示},grid: {  //图表距离left: -3%,right: 5%,bottom: 3%,top:20%,contai…

南邮java实验报告,南邮微机原理实验报告精选.doc

南邮微机原理实验报告精选《微型计算机原理与接口技术》上机实验学 院&#xff1a; 电子科学与工程专 业&#xff1a; 电磁场与无线技术姓 名&#xff1a; 陈秀慧课 程 号&#xff1a; B0300062S学 号&#xff1a;任课老师&#xff1a; 欧晓鸥2016年 3 月 21日实验目的熟悉第四…

Mybatis动态SQL语句使用

在实际开发中&#xff0c;有时候查询条件可能是不确定的&#xff0c;查询条件可能有多条也可能没有&#xff0c;这时候就需要用到动态的sql语句拼接功能。 一、if、where、sql标签的使用 需求&#xff1a;在一些高级查询中&#xff0c;查询条件存在的个数不确定。如&#xff0c…

为什么Vue不能观察到数组length的变化?

官网解释如下 由于 JavaScript 的限制&#xff0c;Vue 不能检测以下变动的数组&#xff1a; 当你利用索引直接设置一个项时&#xff0c;例如&#xff1a;vm.items[indexOfItem] newValue 当你修改数组的长度时&#xff0c;例如&#xff1a;vm.items.length newLength 因为vue…

规则引擎drools的简单使用

规则引擎适用于有复杂多变的规则&#xff0c;如商品满减、积分赠送、考勤规则等 一、引入maven依赖 <dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.13.0.Final</version> </depende…

使用MongoDB进行乐观锁定重试

在我以前的文章中&#xff0c;我谈到了对MongoDB批处理程序采用乐观锁定的好处。 如我之前所写&#xff0c;乐观锁异常是可恢复的异常&#xff0c;只要我们获取最新的Entity&#xff0c;我们就会对其进行更新并保存。 因为我们使用的是MongoDB&#xff0c;所以我们不必担心本地…

cx oracle 配置,cx_Oracle的配置啊。。终于搞出来了

参考。。http://www.blogjava.net/jelver/articles/294583.htmlhttp://shanchao7932297.blog.163.com/blog/static/1363624200710911543428/http://aofengblog.blog.163.com/blog/static/6317021201157111336764/http://www.cnblogs.com/ysisl/archive/2010/12/20/1911870.html…

JavaScript中发布/订阅模式的理解

订阅发布模式的介绍 发布订阅模式&#xff0c;它定义了一种一对多的关系&#xff0c;可以使多个观察者对象对一个主题对象进行监听&#xff0c;当这个主题对象发生改变时&#xff0c;依赖的所有对象都会被通知到。 在生活中我们常常遇到这样一种情况&#xff0c;我们在使用新…

java的list遍历

for(String str : list) {//增强for循环&#xff0c;其内部实质上还是调用了迭代器遍历方式&#xff0c;这种循环方式还有其他限制&#xff0c;不建议使用。System.out.println(str); } for( int i 0 ; i < list.size() ; i) {//普通for循环&#xff0c;内部不锁定&#xf…

Spring Data Solr入门

Spring Data Solr是Spring Data项目的扩展&#xff0c;该项目旨在简化Apache Solr在Spring应用程序中的使用。 请注意&#xff0c;这不是Spring&#xff08;数据&#xff09;或Solr的简介。 我认为您至少对这两种技术都有一些基本的了解。 在下面的文章中&#xff0c;我将展示如…

一个关于fixed抖动的小bug

前言 大家都知道position: fixed用于生成绝对定位的元素&#xff0c;相对于浏览器窗口进行定位。 元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 突然发现自己之前写的网页有个小bug&#xff1a;在购买页面的…