programing

패브릭 JS _ updateObjectsCoords 대체 ? (1.7.9로의 이행 문제)

megabox 2023. 2. 7. 19:43
반응형

패브릭 JS _ updateObjectsCoords 대체 ? (1.7.9로의 이행 문제)

업데이트: JSFiddle: https://jsfiddle.net/Qanary/915fg6ka/

나는 내 것을 만들기 위해 노력하고 있다.curveText기능 작업(이 포스트의 하단 참조)통상은 와 함께 동작합니다.fabric.js 1.2.0하지만 업데이트 했을 때fabric.js1.7.9 커빙 기능은 두 가지 동작을 순차적으로 실행할 때 텍스트를 잘못된 위치에 위치시킨다.

액션 : - 제1호

- 텍스트 그룹 배율이 변경됩니다(즉, 모서리를 마우스로 끌어서 크기를 변경합니다).

- setText가 호출되었습니다.

패브릭 js 1.2.0:

여기에 이미지 설명 입력

패브릭 js 1.7.9

여기에 이미지 설명 입력

디버깅을 했는데 그 이유는_updateObjectsCoordsfabricjs의 경우 코드에서 삭제했을 때 위의 2가지 액션이 정상적으로 동작하기 때문입니다.

문제 2: 그러나 이번에 처음으로 캔버스에 텍스트를 추가할 때 그룹 아이템의 위치가 올바르지 않다는 문제에 직면했습니다.

와 함께_updateObjectsCoords

여기에 이미지 설명 입력

없이._updateObjectsCoords

여기에 이미지 설명 입력

여기서의 기능:

var CurvedText = (function() {

    function CurvedText( canvas, options ){
        this.opts = options || {};
        for ( var prop in CurvedText.defaults ) {
            if (prop in this.opts) { continue; }
            this.opts[prop] = CurvedText.defaults[prop];
        }

        this.canvas = canvas;
        this.group = new fabric.Group([], {selectable: this.opts.selectable,radiusVal:this.opts.radius,spacingVal:this.opts.spacing,textFliping:this.opts.reverse});
        this.canvas.add( this.group ) ;
        this.canvas.centerObject( this.group );
        this.setText( this.opts.text );
        this.canvas.setActiveObject( this.group );
        this.canvas.getActiveObject().setCoords();

    }

    CurvedText.prototype.setObj = function(obj) 
    {
        this.group=obj;
    };

    CurvedText.prototype.setText = function( newText ) {

        this.opts.top=this.group.top;
        this.opts.left=this.group.left;

        while ( newText.length !== 0 && this.group.size() > newText.length ) {
            this.group.remove( this.group.item( this.group.size()-1 ) );
        }

        for ( var i=0; i<newText.length; i++ ){
            if ( this.group.item(i) === undefined ){
                var letter = new fabric.Text(newText[i], {
                    selectable: true
                });
                this.group.add( letter );
            }
            else{
                this.group.item(i).text = newText[i];
            }
        }
        this.opts.text = newText;
        this._setFontStyles();
        this._render();
    };

    CurvedText.prototype._setFontStyles = function() {
        for ( var i=0; i<this.group.size(); i++ ){
            if( this.opts.textStyleName )
            {
                if( this.opts.textStyleName === 'fontFamily' )
                {
                    this.group.item(i).setFontFamily( this.opts.fontFamily );
                }
                if( this.opts.textStyleName === 'fontColor' )
                {
                    this.group.item(i).setFill( this.opts.fontColor );
                }
            }
            else
            {
                this.group.item(i).setFontFamily( this.opts.fontFamily );
                this.group.item(i).setFill( this.opts.fontColor );
            }
            this.group.item(i).setFontSize( this.opts.fontSize );
            this.group.item(i).fontWeight = this.opts.fontWeight ;
        }
    };

    CurvedText.prototype._render = function() {
        var curAngle=0,angleRadians=0, align=0;

        // Object may have been moved with drag&drop
        if ( this.group.hasMoved() ) {
            this.opts.top = this.group.top;
            this.opts.left = this.group.left;
        }
        this.opts.angle = this.group.getAngle();
        this.opts.scaleX = this.group.scaleX;
        this.opts.scaleY = this.group.scaleY;
        this.opts.radius = this.group.radiusVal;
        this.opts.spacing = this.group.spacingVal;
        this.opts.reverse = this.group.textFliping;


        // Text align
        if ( this.opts.align === 'center' ) {
            align = ( this.opts.spacing / 2) * ( this.group.size() - 1) ;
        } else if ( this.opts.align === 'right' ) {
            align = ( this.opts.spacing ) * ( this.group.size() - 1) ;
        }

        for ( var i=0; i<this.group.size(); i++) {
            // Find coords of each letters (radians : angle*(Math.PI / 180)
            if ( this.opts.reverse ) {
                curAngle = (-i * parseInt( this.opts.spacing, 10 )) + align;
                angleRadians = curAngle * (Math.PI / 180);
                this.group.item(i).setAngle( curAngle );
                this.group.item(i).set( 'top', (Math.cos( angleRadians ) * this.opts.radius) );
                this.group.item(i).set( 'left', (-Math.sin( angleRadians ) * this.opts.radius) );
            } else {
                curAngle = (i * parseInt( this.opts.spacing, 10)) - align;
                angleRadians = curAngle * (Math.PI / 180);
                this.group.item(i).setAngle( curAngle );
                this.group.item(i).set( 'top', (-Math.cos( angleRadians ) * this.opts.radius) );
                this.group.item(i).set( 'left', (Math.sin( angleRadians ) * this.opts.radius) ) ;
            }
        }

        // Update group coords
        this.group._calcBounds();
        this.group._updateObjectsCoords();
        this.group.top = this.opts.top;
        this.group.left = this.opts.left;
        this.group.saveCoords();

        this.canvas.renderAll();
    };

    CurvedText.defaults = {
        top: 0,
        left: 0,
        scaleX: 1,
        scaleY: 1,
        angle: 0,
        spacing:0,
        radius:0,
        text: '',
        align: 'center',
        reverse:'',
        fontSize:16,
        fontWeight: 'normal',
        selectable: true,
        fontFamily:'',
        fontColor:'black',
        textStyleName:''
    };

    return CurvedText;
})();

내가 제대로 이해했다면, 이것으로 충분할 거야.

fabricjs 곡면 텍스트

약간만 수정하면updateText()기능:

function updateText() {
  var original = canvas.getActiveObject();
  canvas.remove(original);
  setText();
  canvas.getActiveObject().set({
    angle: original.angle,
    top: original.top,
    left: original.left,
    scaleX: original.scaleX,
    scaleY: original.scaleY
  }).setCoords();
  canvas.renderAll();
}

마지막으로 중요한 JSFiddle 최신 정보(https://jsfiddle.net/rekrah/pkj82n4b/)를 소개합니다.

업데이트(v2) - 기능을 작동시키기 위해 현상금을 청구했으므로 ;-.

다음 행 변경:

this.group = new fabric.Group([], {selectable: this.opts.selectable,name:'arc',radiusVal:this.opts.radius,spacingVal:this.opts.spacing,textFliping:this.opts.reverse,itemName:'text'});

이를 위해:

this.group = new fabric.Group([], {selectable: this.opts.selectable,name:'arc',radiusVal:this.opts.radius,spacingVal:this.opts.spacing,textFliping:this.opts.reverse,itemName:'text',originX:'center',originY:'center'});

좀 더 심미적으로 기분 좋게 하려면...

다음 행 변경:canvas = new fabric.Canvas('c',);

이를 위해:canvas = new fabric.Canvas('c',{centeredScaling: true});

그리고 여기 당신의 원래 Plunker가 다시 업데이트되었습니다. https://jsfiddle.net/rekrah/c7cjzkfd/.

이것으로 끝입니다.updateText()기능을 합니다.

다른 질문이 있으면 알려주세요.기꺼이 도와드리겠습니다!

이용하실 수 있습니다.https://github.com/EffEPi/fabric.curvedText 데모를 보실 수 있습니다.

언급URL : https://stackoverflow.com/questions/43289052/fabric-js-updateobjectscoords-alternative-migration-issue-to-1-7-9

반응형