//头号咸鱼
app.beginUndoGroup("SortLayers");
var thisComp = app.project.activeItem;
var selLayers = thisComp.selectedLayers;
var LN = selLayers.length;
var In = [];
for (var i=0; i < LN; i++)
{
In[i] = selLayers[i].index;
}
In = In.sort(function(a,b){return a-b}); //选择图层顺序列表
// 随便复制一层置底,防止选择了最后一个图层
var last_layer = selLayers[0].duplicate();
last_layer.moveToEnd();
// 遍历 并复制一层(占位图层)、把选择的图层移动到最后
for (var i = 0; i < LN; i++)
{
selLayers[i].duplicate();
selLayers[i].moveAfter(last_layer);
}
// 遍历 把底部选择的图层 放置到顺序index列表后,再把占位图层删掉
for (var i = 0; i < LN; i++)
{
selLayers[i].moveAfter(thisComp.layer(In[i]));
thisComp.layer(In[i]).remove();
}
last_layer.remove();
app.endUndoGroup();
思路
- 先获取选择图层列表,再获取顺序排列的index列表 Array.sort()
- 随便复制一层置底,防止选择了最后一个图层
- 遍历选择图层,复制该图层(占个位置),并移动到最后
- 再把选择的图层移动到顺序数组的图层后
- 然后把占位图层删掉
反向排序的话,中间的In.sort();后面加一句 In.reverse();
优化1:可以把复制图层改成新建一个空白图层?(by月离)
优化2:直接倒序插入也可(by熊猫)
其他思路2(by熊猫)
- 把选中的图层index存进一个数组
- 从小到大排序该数组 Array.sort()
- 遍历选中的图层,判断当前图层的index与数组index是否对应
- 一致则不变,不一致则与目标index的图层
其他(Moelody)
参考即可,我懒得polyfill了
Array.prototype.forEach =
Array.prototype.forEach ||
function(callback, context) {
if (Object.prototype.toString.call(this) === '[object Array]') {
var i, len
for (i = 0, len = this.length; i < len; i++) {
if (typeof callback === 'function' && Object.prototype.hasOwnProperty.call(this, i)) {
if (callback.call(context, this[i], i, this) === false) {
break
}
}
}
}
};