您可以通过覆盖默认的_drawControl()方法来实现。您当前关注的method 正在编写冗余代码。
isVML = function() { return typeof G_vmlCanvasManager !== 'undefined'; };
// overriding _drawControl method
fabric.util.object.extend(fabric.Object.prototype, {
hasRotatingPoint: true,
cornerSize: 10,
_drawControl: function(control, ctx, methodName, left, top) {
if (!this.isControlVisible(control)) {
return;
}
var size = this.cornerSize;
isVML() || this.transparentCorners || ctx.clearRect(left, top, size, size);
if(control !== 'tl')
ctx['fillRect'](left, top, size, size);
var SelectedIconImage = new Image();
if(control === 'tl') {
SelectedIconImage.src = 'http://www.navifun.net/files/pins/tiny/Arrow-Rotate-Clockwise.png';
ctx.drawImage(SelectedIconImage, left, top, size, size);
}
}
});
现在,为了向图标添加旋转功能,覆盖以下画布方法:
var cursorOffset = {
mt: 0, // n
tr: 1, // ne
mr: 2, // e
br: 3, // se
mb: 4, // s
bl: 5, // sw
ml: 6 // w
}
fabric.util.object.extend(fabric.Canvas.prototype, {
setCursor: function (value) {
this.upperCanvasEl.style.cursor = value;
},
_getActionFromCorner: function(target, corner) {
var action = 'drag';
if (corner) {
action = (corner === 'ml' || corner === 'mr')
? 'scaleX'
: (corner === 'mt' || corner === 'mb')
? 'scaleY'
: (corner === 'mtr' || corner === 'tl' )
? 'rotate'
: 'scale';
}
return action;
},
_setCornerCursor: function(corner, target) {
if ((corner === 'mtr' || corner === 'tl') && target.hasRotatingPoint) {
this.setCursor(this.rotationCursor);
}
else if (corner in cursorOffset) {
this.setCursor(this._getRotatedCornerCursor(corner, target));
}
else {
this.setCursor(this.defaultCursor);
return false;
}
}
});
See the Fiddle