【问题标题】:Replacing Fill Colors in JSFL替换 JSFL 中的填充颜色
【发布时间】:2014-07-26 21:09:03
【问题描述】:

我正在尝试编写一个 JSFL 脚本,该脚本将替换与所选帧上给定颜色匹配的所有轮廓填充。

我的问题是,如果我按照 JSFL 文档的规定调用 shape.beginEdit() 和 shape.endEdit(),每当我访问轮廓上的填充属性(甚至是只读访问)时,脚本就会崩溃。错误消息是“发生以下 JavaScript 错误:”,没有其他信息。

如果我省略 shape.begin/endEdit() 调用,脚本不会崩溃,但颜色实际上不会更新。

我尝试在 Flash CS5.5、CS6 和 CC 中运行此脚本,结果相同。

如果有人能指出我遗漏了什么,我将不胜感激。

脚本:

var replaceFills = {
    '#ff0000': '#33cccc',
    '#33cccc': '#ff0000',
    '#66ff00': '#00ffff',
    '#00ffff': '#66ff00',

    '#2173a6': '#ff00ff',
    '#ff00ff': '#2173a6',

    '#195480': '#ff00ff',
    '#ff00ff': '#195480',
};

function recolor(element) {
    if (element.elementType == "shape") {
        element.beginEdit();

        for (var j = 0; j < element.contours.length; j++) {
            var c = element.contours[j];
            if (c.interior && c.fill) {
                if (c.fill.style == 'solid') {
                    if (c.fill.color in replaceFills) {
                        c.fill.color = replaceFills[c.fill.color];
                    }
                }
            }
        }
        element.endEdit();
    }
}

function recolorFrame(frame) {
    var elements = frame.elements;
    for (var i = 0; i < elements.length; i++)
        recolor(elements[i]);
}


var curSelected = fl.getDocumentDOM().getTimeline().getSelectedFrames();

for (var i = 0; i < curSelected.length; i += 3) {
    var layerIndex = curSelected[i];
    var startIndex = curSelected[i + 1];
    var endIndex = curSelected[i + 2];

    var layer = fl.getDocumentDOM().getTimeline().layers[layerIndex];

    for (var j = startIndex; j < endIndex; j++) {
        var frame = layer.frames[j];
        if (j == frame.startFrame)
            recolorFrame(frame);
    }
}

【问题讨论】:

    标签: javascript flash adobe jsfl


    【解决方案1】:

    像这样编辑你的函数:

    function recolor(element) {
    if (element.elementType == "shape") {
    //del   element.beginEdit();
    
        for (var j = 0; j < element.contours.length; j++) {
            var c = element.contours[j];
            if (c.interior && c.fill) {
                if (c.fill.style == 'solid') {
                    if (c.fill.color in replaceFills) {
    //del                   c.fill.color = replaceFills[c.fill.color];
    //add this
                            var fill = element.getCustomFill();
                            fill.style = "solid";
                            fill.color = replaceFills[c.fill.color];
                            element.setCustomFill(fill);
    //end
                        }
                    }
                }
            }
    //del   element.endEdit();
         }
      }
    

    【讨论】:

      【解决方案2】:

      FWIW,也可以使用位于Edit 下的Find &amp; Replace 面板替换颜色。

      【讨论】:

        【解决方案3】:

        Mike 的回答确实改变了颜色,但不幸的是,如果一个形状由多个不同颜色的轮廓组成,它们都会改变。

        相反,获取填充、更改颜色以及将填充重新分配给轮廓就可以了。

        var fill = contour.fill;
        
        if(fill.color in replaceFills)
        {
            fill.color = replaceFills[fill.color];
            contour.fill = fill;
        }
        

        【讨论】:

          猜你喜欢
          • 2017-01-05
          • 2011-01-16
          • 2015-04-11
          • 2014-10-27
          • 2012-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-12
          相关资源
          最近更新 更多