【问题标题】:Change control fill color while scaling object in Fabricjs在 Fabricjs 中缩放对象时更改控件填充颜色
【发布时间】:2019-11-26 04:47:34
【问题描述】:

几天来,我一直在尝试更改缩放对象的控件的填充颜色。

这是我正在谈论的内容的 gif:

我想要一些关于如何实现这一目标的指导。几天来,我一直在研究 Fabricjs 文档,试图了解如何解决这个问题。

https://github.com/fabricjs/fabric.js/wiki/Working-with-events

我的理论是绑定到 mouse:down 和 mouse:up 事件。当mouse:down 事件触发时,获取控件上下文并更改其填充颜色,当mouse:up 触发时,恢复填充颜色。

不幸的是,我找不到任何能让我获得控制上下文的 fabricjs 方法。

http://fabricjs.com/docs/fabric.Canvas.html

http://fabricjs.com/docs/fabric.Object.html


    canvas.on('mouse:down',(){
     // Obtain control context and change fill

    });
    canvas.on('mouse:up',(){
    // Obtain control context and restore fill

    });

我使用的是 Fabricjs 3.2.0 版

【问题讨论】:

    标签: fabricjs fabricjs2


    【解决方案1】:

    我从fabric.Object 覆盖了_drawControl。如您所见,我验证了this.__corner control 变量,如果相等,我将填充和描边颜色更改为红色。很重要我在绘制控件后恢复了上下文

    var canvas = new fabric.Canvas('fabriccanvas');
    canvas.add(new fabric.Rect({
            top: 50,
            left: 50 ,
            width: 100,
            height: 100,
            fill: '#' + (0x1000000 + (Math.random()) * 0xffffff).toString(16).substr(1, 6),
            //fix attributes applied for all rects
           cornerStyle:"circle",
            originX: 'left',
            originY: 'top',
            transparentCorners:false
            
        }));
    fabric.Object.prototype._drawControl =    function(control, ctx, methodName, left, top, styleOverride) {
          styleOverride = styleOverride || {};
          if (!this.isControlVisible(control)) {
            return;
          }
          var size = this.cornerSize, stroke = !this.transparentCorners && this.cornerStrokeColor;
          switch (styleOverride.cornerStyle || this.cornerStyle) {
            case 'circle':
            if(control == this.__corner){
              ctx.save();
            	ctx.strokeStyle = ctx.fillStyle='red';
            }
              ctx.beginPath();
              ctx.arc(left + size / 2, top + size / 2, size / 2, 0, 2 * Math.PI, false);
              ctx[methodName]();
              if (stroke) {
                ctx.stroke();
              }
              if(control == this.__corner){
              ctx.restore();
            	
            }
              break;
            default:
              this.transparentCorners || ctx.clearRect(left, top, size, size);
              ctx[methodName + 'Rect'](left, top, size, size);
              if (stroke) {
                ctx.strokeRect(left, top, size, size);
              }
          }
        } 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.2.0/fabric.js"></script>
    
    <br/>
    <canvas id="fabriccanvas" width="600" height="200" style="border:1px solid #ccc"></canvas>

    【讨论】:

    • 你有什么想法应该在 Farbic.js 4.2.0 中覆盖哪个函数?
    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2013-08-22
    • 2018-11-21
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多