找回密码
 注册
搜索
查看: 2802|回复: 0

给excanvas添加fillText方法

[复制链接]
发表于 2012-7-27 16:34:16 | 显示全部楼层 |阅读模式
excanvas使得IE能通过VML支持Canvas标签,但是在一些细节方面还是不尽人意.
比如
1.动态生成的Canvas对象将不支持getContext方法,
2.drawImage方法不能用Canvas对象作为第一个参数,
3.不支持fillText等方法.

本文针对以上三个问题给出改进方案.
1.要使IE中的Canvas对象支持getContext等方法需要调用excanvas中的G_vmlCanvasManager_.initElement方法,由于最后的
  1. G_vmlCanvasManager = G_vmlCanvasManager_;
复制代码
使得G_vmlCanvasManager的作用域是当前window,所以在需要初始化Canvas的时候可以采用如下的方法:
  1. var cav = document.createElement("canvas");
  2. if(!cav.getContext) {
  3.   G_vmlCanvasManager.initElement(cav);
  4. }
  5. var ctx = cav.getContext("2d");
  6. ...
复制代码
2.excanvas中的drawImage方法只接受Image对象为第一个参数,为了使其支持Canvas对象的绘制,可修改如下代码(在excanvas.js中检索到"contextPrototype.drawImage"所在行):
  1. contextPrototype.drawImage = function(image, var_args) {
  2.           if (image.getContext) { // draw canvas           
  3. this.element_.innerHTML += image.getContext("2d").element_.innerHTML;        
  4. }
  5. var dx, dy, dw, dh, sx, sy, sw, sh;
  6. ...
复制代码
3.fillText,measureText也已成为CanvasRenderingContext2D对象的标准方法,为了使IE也能支持,在excanvas.js中添加以下代码:
  1. contextPrototype.measureText = function(textToDraw) {
  2. var hiddenSpan = document.createElement('span');
  3. hiddenSpan.style.font = this.font;
  4. hiddenSpan.innerHTML = textToDraw;
  5. var bodyNode = document.getElementsByTagName("body")[0];
  6. bodyNode.appendChild(hiddenSpan);
  7. var width = hiddenSpan.offsetWidth;
  8. bodyNode.removeChild(hiddenSpan);
  9. return {"width" : width + 1};
  10. }

  11. contextPrototype.fillText = function(textToDraw, x, y) {
  12.     var vmlStr = [];
  13.     var textHeightStr = this.font.split("px")[0].replace(/(^\s+)|(\s+$)/g, "");
  14.     var textHeight = /^\d+$/.test(textHeightStr) ? parseInt(textHeightStr) : 0;
  15.     vmlStr.push('<g_vml_:shape style="font:' + this.font + ';', ' color:' + this.fillStyle + ';',
  16.                     ' position:absolute;',
  17.                     ' left:' + x + 'px;',
  18.                     ' top:' + (y - textHeight) + 'px;',
  19.                     ' width:' + this.measureText(textToDraw).width + 'px;',
  20.                     ' height:' + textHeight + 'px;"',
  21.                     ' ><g_vml_:textbox inset="0,0,0,0">' + textToDraw,
  22.                     ' </g_vml_:textbox>',
  23.                     '</g_vml_:shape>');
  24.     this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''));
  25. }
复制代码
其中measureText是通过在页面上添加一个隐藏的临时文字容器并获得其宽度来实现.
另外在属性声明的地方要添加默认字体
  1. // Canvas context properties
  2. this.strokeStyle = '#000';
  3. this.fillStyle = '#000';
  4. this.font = '12px sans-serif';
  5. ...
复制代码
如果还有其他的什么需求或是想法 欢迎与我联系 ck0123456@gmail.com

原文:http://ck-2036.iteye.com/blog/800897
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-6-19 04:24 , Processed in 0.015198 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表