读书人

给excanvas平添fillText方法

发布时间: 2012-10-30 16:13:36 作者: rapoo

给excanvas添加fillText方法
excanvas使得IE能通过VML支持Canvas标签,但是在一些细节方面还是不尽人意.
比如
1.动态生成的Canvas对象将不支持getContext方法,
2.drawImage方法不能用Canvas对象作为第一个参数,
3.不支持fillText等方法.

本文针对以上三个问题给出改进方案.
1.要使IE中的Canvas对象支持getContext等方法需要调用excanvas中的G_vmlCanvasManager_.initElement方法,由于最后的

G_vmlCanvasManager = G_vmlCanvasManager_;
使得G_vmlCanvasManager的作用域是当前window,所以在需要初始化Canvas的时候可以采用如下的方法:
var cav = document.createElement("canvas");if(!cav.getContext) {  G_vmlCanvasManager.initElement(cav);}var ctx = cav.getContext("2d");...

2.excanvas中的drawImage方法只接受Image对象为第一个参数,为了使其支持Canvas对象的绘制,可修改如下代码(在excanvas.js中检索到"contextPrototype.drawImage"所在行):
  contextPrototype.drawImage = function(image, var_args) {  if (image.getContext) { // draw canvas    this.element_.innerHTML += image.getContext("2d").element_.innerHTML;  }    var dx, dy, dw, dh, sx, sy, sw, sh;...

3.fillText,measureText也已成为CanvasRenderingContext2D对象的标准方法,为了使IE也能支持,在excanvas.js中添加以下代码:
  contextPrototype.measureText = function(textToDraw) {    var hiddenSpan = document.createElement('span');    hiddenSpan.style.font = this.font;    hiddenSpan.innerHTML = textToDraw;    var bodyNode = document.getElementsByTagName("body")[0];    bodyNode.appendChild(hiddenSpan);    var width = hiddenSpan.offsetWidth;    bodyNode.removeChild(hiddenSpan);    return {"width" : width + 1};  }  contextPrototype.fillText = function(textToDraw, x, y) {    var vmlStr = [];    var textHeightStr = this.font.split("px")[0].replace(/(^\s+)|(\s+$)/g, "");    var textHeight = /^\d+$/.test(textHeightStr) ? parseInt(textHeightStr) : 0;    vmlStr.push('<g_vml_:shape style="font:' + this.font + ';',                    ' color:' + this.fillStyle + ';',                    ' position:absolute;',                    ' left:' + x + 'px;',                    ' top:' + (y - textHeight) + 'px;',                    ' width:' + this.measureText(textToDraw).width + 'px;',                    ' height:' + textHeight + 'px;"',                    ' ><g_vml_:textbox inset="0,0,0,0">' + textToDraw,                    ' </g_vml_:textbox>',                    '</g_vml_:shape>');    this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''));  }
其中measureText是通过在页面上添加一个隐藏的临时文字容器并获得其宽度来实现.
另外在属性声明的地方要添加默认字体:
    // Canvas context properties    this.strokeStyle = '#000';    this.fillStyle = '#000';    this.font = '12px sans-serif';...

如果还有其他的什么需求或是想法 欢迎与我联系 ck0123456@gmail.com 1 楼 chaos2003 2011-11-30 太厉害了!非常感谢 2 楼 psj1605 2012-05-07 太感谢了 没你这方法 我的项目都没法往下做了
有办法让excanvas支持toDataURL属性吗?

读书人网 >Web前端

热点推荐