替换 JSFL 中的填充颜色
Posted
技术标签:
【中文标题】替换 JSFL 中的填充颜色【英文标题】:Replacing Fill Colors in 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);
【问题讨论】:
【参考方案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 & Replace
面板替换颜色。
【讨论】:
【参考方案3】:Mike 的回答确实改变了颜色,但不幸的是,如果一个形状由多个不同颜色的轮廓组成,它们都会改变。
相反,获取填充、更改颜色以及将填充重新分配给轮廓就可以了。
var fill = contour.fill;
if(fill.color in replaceFills)
fill.color = replaceFills[fill.color];
contour.fill = fill;
【讨论】:
以上是关于替换 JSFL 中的填充颜色的主要内容,如果未能解决你的问题,请参考以下文章