【问题标题】:FabricJS and AngularJS – get and set shadows on active objectsFabricJS 和 AngularJS – 获取和设置活动对象的阴影
【发布时间】:2018-02-23 03:19:11
【问题描述】:

我正在扩展fabric.js kitchensink 的一些功能。我尝试获取和设置活动对象的阴影属性但没有成功,但我确信我错过了一些微不足道的东西。这就是我在我的 controllers.js 中所做的:

在选定对象上设置/启用阴影:

$scope.shadowify = function () {
    var obj = canvas.getActiveObject();
    if (!obj) return;

    if (obj.shadow) {
        obj.shadow = null;
    } else {
        obj.setShadow({
            color: "#000000",
            blur: 10,
            offsetX: 10,
            offsetY: 10
        });
    }
    canvas.renderAll();
};

这是有效的(就像在厨房水槽示例中所做的那样)

获取/设置阴影:

function getActiveShadow(name) {
    var object = canvas.getActiveObject();
    if (!object) return '';

    return object[name] || '';
}

function setActiveShadow(name, value) {
    var object = canvas.getActiveObject();
    if (!object) return;
    object.setShadow(name, value);
    object.setCoords();
    canvas.renderAll();
}

和:

$scope.setShadowOffsetX = function (value) {
    setActiveShadow('offsetX', value);
    canvas.renderAll();
};


$scope.setShadowOffsetY = function (value) {
    setActiveShadow('offsetY', value);
    canvas.renderAll();
};

$scope.setShadowBlur = function (value) {
    setActiveShadow('blur', value);
    canvas.renderAll();
};

$scope.setShadowColor = function (value) {
    setActiveShadow('color', value);
    canvas.renderAll();
    console.log, (value);
};

这是我的 HTML 中的一些示例代码,用于将值绑定到输入:

<input type="color" 
       id="shadC" 
       value="#455A64" 
       class="small" 
       bind-value-to="shadowColor" 
       ng-model="shadC">


<input type="number" 
       class="small" 
       ng-value="10" 
       id="shadX" 
       skin="condensed" 
       bind-value-to="shadowOffsetX" 
       ng-model="offsetX">

不知道那里发生了什么——当我更改输入中的值时,整个阴影消失了。这种方法非常适用于宽度/高度等基本对象设置。所以我希望我做错了真的是微不足道的事情。

【问题讨论】:

  • 你能创建一个 plnkr 或小提琴吗?
  • 感谢您的编辑!会尝试把一些东西放在一起,但是只用请求的代码重做这个是相当复杂的,因为整个项目非常复杂。无论如何我都会尽力而为。
  • 始终可以创建一个最小的 fiddle/plnkr 来重现您的问题。我们不需要你的整个项目来重现这个。

标签: javascript angularjs fabricjs


【解决方案1】:

function getActiveShadow(name) {
    var object = canvas.getActiveObject();
    if (!object) return '';

    return object[name] || '';
}

function setActiveShadow(name, value) {

    var object = canvas.getActiveObject();
    if (!object) return;
    if(object.shadow)
     object.shadow[name] = value;
    else{
     var ob = {};
     ob[name] = value;
     object.setShadow(ob);
    }
    
    object.setCoords();
}
var offsetXVal = 10;
var setShadowOffsetX = function (value) {
    value = offsetXVal+=5;
    setActiveShadow('offsetX', value);
    canvas.renderAll();
};

var offsetYVal = 10;
var setShadowOffsetY = function (value) {
    value = offsetYVal+=5;
    setActiveShadow('offsetY', value);
    canvas.renderAll();
};
var offBlurVal = 10;
var setShadowBlur = function (value) {
    value =  offBlurVal += 5;
    setActiveShadow('blur', value);
    canvas.renderAll();
};

var setShadowColor = function (value) {
    value = 'blue';
    setActiveShadow('color', value);
    canvas.renderAll();
};

var shadowify = function () {
    var obj = canvas.getActiveObject();
    if (!obj) return;

    if (obj.shadow) {
        obj.shadow = null;
    } else {
        obj.setShadow({
            color: "#000000",
            blur: 10,
            offsetX: 10,
            offsetY: 10
        });
    }
    canvas.renderAll();
};

var canvas = new fabric.Canvas('c');
canvas.add(new fabric.Rect({
  left:50,
  top:50,
  width:100,
  height:100,
  fill:'blue'

}))
canvas {
 border: blue dotted 2px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.18/fabric.min.js"></script>
<button onclick='shadowify()'>shadowify</button>
<button onclick='setShadowOffsetX()'>setShadowOffsetX</button>
<button onclick='setShadowOffsetY()'>setShadowOffsetY</button>
<button onclick='setShadowBlur()'>setShadowBlur</button>
<button onclick='setShadowColor()'>setShadowColor</button>
<canvas id="c" width="400" height="400"></canvas><br>

setShadow 创建一个fabric.Shadow 的对象,所以当你想更改属性时,只需使用object.shadow 获取对象并将属性应用于阴影对象。

【讨论】:

  • 完美的先生!诀窍在于“函数 setActiveShadow”部分。现在完全按照我的预期工作(通过在 $scope 中定义“offsetX”等,就像在我之前的代码中一样。非常感谢队友!
  • - 不知道如何获取 function getActiveShadow 中的值 - 请您帮忙吗?
  • 尝试返回object.shadow[name]
  • 我正在尝试这个function getActiveShadow(name) { var object = canvas.getActiveObject(); if (!object) return ''; return object.shadow[name] || ''; }
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
相关资源
最近更新 更多