How can i change the rotation icon in fabricjs

前端 未结 7 2010
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-03 03:45

Please guide me to modify Fabricjs to add custom icon for Rotation.

I get some of the answers but it is not working fine.

Please let me know the code to chan

7条回答
  •  太阳男子
    2021-01-03 04:17

    Change fabric object prototype "drawControls" like this.

    Here is an example and JSFiddle:

    fabric.Object.prototype.drawControls = function (ctx) {
        if (!this.hasControls) return this;
    
    
        var size = this.cornerSize,
            size2 = size / 2,
            strokeWidth2 = ~~(this.strokeWidth / 2), // half strokeWidth rounded down
            left = -(this.width / 2),
            top = -(this.height / 2),
            paddingX = this.padding / this.scaleX,
            paddingY = this.padding / this.scaleY,
            scaleOffsetY = size2 / this.scaleY,
            scaleOffsetX = size2 / this.scaleX,
            scaleOffsetSizeX = (size2 - size) / this.scaleX,
            scaleOffsetSizeY = (size2 - size) / this.scaleY,
            height = this.height,
            width = this.width,
            methodName = this.transparentCorners ? 'strokeRect' : 'fillRect';
    
        ctx.save();
    
        ctx.lineWidth = 1 / Math.max(this.scaleX, this.scaleY);
    
        ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;
        ctx.strokeStyle = ctx.fillStyle = this.cornerColor;
    
        // top-left
        this._drawControl('tl', ctx, methodName,
            left - scaleOffsetX - strokeWidth2 - paddingX,
            top - scaleOffsetY - strokeWidth2 - paddingY);
    
        // top-right
        this._drawControl('tr', ctx, methodName,
            left + width - scaleOffsetX + strokeWidth2 + paddingX,
            top - scaleOffsetY - strokeWidth2 - paddingY);
    
        // bottom-left
        this._drawControl('bl', ctx, methodName,
            left - scaleOffsetX - strokeWidth2 - paddingX,
            top + height + scaleOffsetSizeY + strokeWidth2 + paddingY);
    
        // bottom-right
        this._drawControl('br', ctx, methodName,
            left + width + scaleOffsetSizeX + strokeWidth2 + paddingX,
            top + height + scaleOffsetSizeY + strokeWidth2 + paddingY);
    
        if (!this.get('lockUniScaling')) {
    
            // middle-top
            this._drawControl('mt', ctx, methodName,
                left + width / 2 - scaleOffsetX,
                top - scaleOffsetY - strokeWidth2 - paddingY);
    
            // middle-bottom
            this._drawControl('mb', ctx, methodName,
                left + width / 2 - scaleOffsetX,
                top + height + scaleOffsetSizeY + strokeWidth2 + paddingY);
    
            // middle-right
            this._drawControl('mr', ctx, methodName,
                left + width + scaleOffsetSizeX + strokeWidth2 + paddingX,
                top + height / 2 - scaleOffsetY);
    
            // middle-left
            this._drawControl('ml', ctx, methodName,
                left - scaleOffsetX - strokeWidth2 - paddingX,
                top + height / 2 - scaleOffsetY);
        }
    
        // middle-top-rotate
        if (this.hasRotatingPoint) {
            /*
             We dont need old corner for rotate :)
    
             this._drawControl('mtr', ctx, methodName,
             left + width/2 - scaleOffsetX,
             this.flipY
             ? (top + height + (this.rotatingPointOffset / this.scaleY) - this.cornerSize/this.scaleX/2 + strokeWidth2 + paddingY)
             : (top - (this.rotatingPointOffset / this.scaleY) - this.cornerSize/this.scaleY/2 - strokeWidth2 - paddingY));
    
             Draw rotate custom icon
             */
            var rotate = new Image(), rotateLeft, rotateTop;
            rotate.src = 'http://www.navifun.net/files/pins/tiny/Arrow-Rotate-Clockwise.png';
    
            rotateLeft = left + width / 2 - scaleOffsetX;
            rotateTop = this.flipY
                ? (top + height + (this.rotatingPointOffset / this.scaleY) - this.cornerSize / this.scaleX / 2 + strokeWidth2 + paddingY)
                : (top - (this.rotatingPointOffset / this.scaleY) - this.cornerSize / this.scaleY / 2 - strokeWidth2 - paddingY);
    
            ctx.drawImage(rotate, rotateLeft, rotateTop, size / this.scaleX, size / this.scaleY);
    
    
        }
    
        ctx.restore();
    
        return this;
    };
    

提交回复
热议问题