【问题标题】:Fabric JS _updateObjectsCoords alternative? (Migration issue to 1.7.9)Fabric JS _updateObjectsCoords 替代方案? (迁移到 1.7.9 的问题)
【发布时间】:2017-09-03 11:36:13
【问题描述】:

更新: JSFiddle:https://jsfiddle.net/Qanary/915fg6ka/

我正在尝试使我的curveText 功能正常工作(请参阅本文底部)。它通常与fabric.js 1.2.0 一起工作,但是当我更新到fabric.js 1.7.9 时,当两个动作顺序执行时,弯曲功能会将文本定位在错误的位置。

行动:- 问题 1

-文本组比例改变(我的意思是用鼠标拖动角点来改变大小)。

-setText 调用

织物 js 1.2.0:

织物 js 1.7.9

我对其进行了调试,原因是 fabricjs 中的 _updateObjectsCoords,因为当我从代码中删除它时,上面列出的 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;
})();

【问题讨论】:

  • 我尝试了 JSfiddle 并且示例运行良好,您可以发送从 fiddle 获取的结果的屏幕截图吗?
  • @ProllyGeek ,请按顺序尝试我提到的操作。 1- 添加文本,2- 从角落更改文本的比例,3- 单击更新文本。屏幕截图已经嵌入到问题中。谢谢。
  • @HOY 我在下面更新了我的答案。

标签: javascript jquery wordpress fabricjs


【解决方案1】:

如果我理解正确的话,应该这样做:

只需对您的 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() 功能保持原样。

如果您有任何其他问题,请告诉我。总是乐于提供帮助!

【讨论】:

  • 嗨,蒂姆,您的问题是正确的,并通过调整更正了该功能。我很感激,这真的很有帮助。但是我的 curlText 函数更详细,其他功能(如更改颜色、更改间距)仍然会破坏上面的组位置。因此,我也尝试将您的调整用于其他功能,但遇到了困难。工作一点后我会告诉你细节。完整的功能很难在 jsfiddle 上实现。顺便说一句,在你的第二个 jsfiddle 上,当添加新文本时,更新有问题。
  • 别担心,我明白。有时获得一个说明问题的 JSFiddle 可能会很棘手 - 当您这样做时,最终可能会解决问题:-)。当您有更多内容时,只需更新您的问题。不确定第二个 JSFiddle 指的是什么问题,没有 .setCoords() 我注意到需要添加(我已经更新了 JSFiddle)。这是 FabricJS 的更改日志,但不确定它是否可以追溯到足够远...http://fabricjs.com/fabric-changelog
  • 让我知道是否可以再提供帮助?
  • 谢谢蒂姆,我已经用你的解决方案解决了问题,我不希望立即给予赏金,因为它可能会阻止其他答案,我想知道是否还有其他解决方案。但无论如何我都会给你赏金。 :)
  • 我完全理解。只是不确定事情进展如何,因为我没有收到你的消息。很高兴你进展顺利。我实际上是在这个预生产网站http://xpressclocks.azurewebsites.net/create 上运行 1.2 版,并且确实从某个时候开始考虑升级 - 因此我的经验。如果我和我的搭档将其付诸实施(并且它变得有些有利可图),我将走上与您类似的道路:-)!!!如果您在继续时还有其他问题,请告诉我,我们很乐意为您提供帮助 - 我们现在已经联系上了,伙计!
【解决方案2】:

你可以用这个:https://github.com/EffEPi/fabric.curvedText你可以看demo

【讨论】:

  • 你好Sofiane,我用过但是遇到了另一个问题,在github上打开了一个issue,楼主没有回复,也没有好的反馈。所以它没有帮助。您可以在这里查看:github.com/EffEPi/fabric.curvedText/issues/37
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
相关资源
最近更新 更多