SVG与Canvas是HTML5上绘制图形应用的两种完全不同模式的技术,两种绘制图形方式各有优缺点,但两者并非水火不容,尤其是SVG内容可直接绘制在Canvas上的功能,使得两者可以完美的融合在一起,让Canvas可享用到现有丰富的SVG素材,并不失SVG矢量无级缩放的特点。

《基于HTML5的Drag and Drop生成图片Base64信息》这篇虽然展示的是拖拽普通栅格图片的效果,但你也可以直接拖拽SVG格式的图片进行显示,只不过普通图片的格式数据为data:image/png类型,而SVG格式的数据类型为data:image/svg+xml的类型,下图为该HT for Web拓扑图拖拽入SVG格式图片的运行效果:

以下一段小例子,展示了加载一个SVG图片后,分为七个基本进行缩放绘制的效果,可看出Canvas绘制SVG可保持其矢量不失真的特性

function draw(){ var img = new Image(); img.src = 'chart.svg'; document.body.appendChild(img); img.onload = function(){ var canvas = document.getElementById('canvas'); var g = canvas.getContext('2d');  var width = img.clientWidth * 1.5; var height = img.clientHeight * 1.5;  var x = 2; var y = 2; for(var i=0; i<7; i++){ g.drawImage(img, x, y, width, height); x += width + 2; width /= 2; height /= 2; }  };}

提到Canvas和SVG的融合,我们将采用HT for Web的矢量功能展示一个手机电池充电进度的实例,整个手机电池的静态部分我们通过加载一个简单的SVG素材实现,而充电动态变化的部分,我们采用一个渐进色的HT矩形元素来描述,该矩形的长度通过HT矢量数据动态绑定功能,根据充电进度的百分比换算成长度信息,最后通过定时器模拟数据变化达到动态充电的效果:

ht.Default.setImage('battery', { width: 64, height: 64, comps: [  { type: 'rect', rect: { func: function(data){ return [5, 25, 50*data.a('percent'), 16] } }, background: 'red', gradient: 'spread.vertical' },  { type: 'image', name: 'battery.svg', relative: true, rect: [0, 0, 1, 1] } ]}); var node = new ht.Node();node.setPosition(80, 150);node.setImage('battery');node.s('image.stretch', 'uniform');node.a('percent', 0);dataModel.add(node); graphView.setEditable(true);setInterval(function(){ percent = node.a('percent') + 0.02; if(percent > 1){ percent = 0; } node.a('percent', percent);}, 16);

SVG绘制到Canvas还有一种特殊的应用场景,就是将HTML元素通过SVG的foreignObject特性描述在SVG中,然后Canvas绘制SVG时,即可把foreignObject描述的HTML内容绘制到Canvas上,可参见https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas 的实例,其中采用了Blob的方式设置img的src作为URL是比较怪异的技术点,但从上文提到其实我们可以将整个SVG内容转换成data:image/svg+xml;的base64内容即可作为src的url传入,因此我对该例子做了改造,采用btoa(data)把svg内容转换成base64的方式设置img.src,这样方式更容易理解,例子代码和效果如下:http://v.youku.com/v_show/id_XODg0MTU4NjEy.html

function draw(){ var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var data = 。。。; var img = new Image(); img.onload = function () { ctx.drawImage(img, 0, 0); };  img.src = 'data:image/svg+xml;base64,' + btoa(data);}

canvas 元素绑定事件_绘制SVG内容到Canvas的HTML5应用相关推荐

  1. html5 svg组态图,绘制SVG内容到Canvas的HTML5应用

    SVG与Canvas是HTML5上绘制图形应用的两种完全不同模式的技术,两种绘制图形方式各有优缺点,但两者并非水火不容,尤其是SVG内容可直接绘制在Canvas上的功能,使得两者可以完美的融合在一起, ...

  2. 设置元素的宽和高 元素的left和top 元素卷曲出去的值 为元素绑定事件

    设置元素的宽和高 <!DOCTYPE html> <html lang="en"> <head><meta charset="U ...

  3. html 未来元素绑定事件,jquery on如何给未来元素绑定事件?

    我们要想在一个元素上绑定一个事件,那么这个元素必须先存在,也就是绑定事件动作前就已有这个元素. 这是一个给元素绑定任何事件的前提. 如果按照这种思路走,那么"给未来元素绑定事件"将 ...

  4. jQuery给动态添加的元素绑定事件的方法

    jquery中绑定事件一般使用bind,或者click,但是这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定.在1.7版本以前使用live.但是在1.8版本以后推荐使用on.这 ...

  5. 另一个绑定事件的方式 为元素绑定事件的区别

    另一个绑定事件的方式 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  6. jQuery 为动态添加的元素绑定事件

    在使用jquery的方式为元素绑定事件时,我经常使用bind或者click,但这只能为页面已经加载好的元素绑定事件.像需要用ajax的方式请求远程数据来动态添加页面元素时,显然以上几种绑定事件的方式是 ...

  7. 给动态动态生成元素绑定事件不生效解决方法

    如题:动态生成的元素绑定事件后没有生效,或者说操作时没有效果 js,jq动态生成的元素,在绑定前,先一定要确认,执行绑定操作的时候,该元素是不是已经存在在页面上,也就是html上了,假如执行绑定的时候 ...

  8. JavaScript动态生成元素绑定事件时的一些问题、解决与思考

    先上结论: 在用js给动态生成的dom元素添加事件时会遇到很多坑. 坑1:使用了 queryselectorall方法获取元素,这个方法获得的是一个静态的Nodelist伪数组,这意味着之后无论你如何 ...

  9. v-for元素绑定事件代理

    题目: vue 在 v-for 时给每项元素绑定事件需要用事件代理吗?为什么? 解析: 事件代理作用主要是 2 个 将事件处理程序代理到父节点,减少内存占用率 动态生成子节点时能自动绑定事件处理程序到 ...

最新文章

  1. 常用16种视图切换动画
  2. java使用jdbc的查询_如何在Java中使用多个查询使用JDBC
  3. BASIC-2 01字串
  4. 完成DI 依赖注入功能
  5. servlet中getWriter和getOutputStream的区别
  6. nodejs之express入门
  7. ExtJS4之helloworld
  8. LeetCode刷题(31)
  9. 输入几个分数,去除最高2个,最低2个,求和以后再求平均分(5个以上)
  10. python - 列表
  11. json爬虫获取列表数据不全,已解决
  12. Linux操作系统的VI命令
  13. label之间展示间距_工法样板如何做?碧桂园质量工法样板展示区做法标准
  14. 市民卡怎么登录显示服务器繁忙,2分钟办理一笔业务 杭州网记者体验最具人气的“市民卡”窗口服务...
  15. CSDN账号注销的问题:手机号注册的CSDN号是可以注销的
  16. 爬虫python下载网站所有图片_Python爬虫-搜索并下载图片
  17. linux网桥--简介
  18. java动态代理特性学习
  19. M5stack StickCplus ESP32物联网开发板初体验
  20. pyhton爬诛仙小说

热门文章

  1. SAP Spartacus Register 页面为空白的解决方案
  2. SAP云平台和SAP C4C之间的OAuth2.0配置
  3. 如何去除Eclipse Maven插件里关于Managed version的警告消息
  4. where is language of sap.ui.getCore().getConfiguration set - locale
  5. scn SAP UI5 exercise - create root view
  6. 在SAP除了使用Cordova生产移动应用外,还有这种方式
  7. Angular groupBy test
  8. how to find the original page containing a given image
  9. 重用CL_CRM_QUERYAUI_RUN_BTIL实现order search
  10. SAP ABAP实用技巧介绍系列之 How is configuration data loaded