Adobe Animate如何获取主时间轴各帧图片的坐标与尺寸?
问题分析与解决方案
你的核心问题是错误地遍历了MainTimeline的直接子元素,而非动画帧内的图层元素。Animate中,关键帧里的图片/图形元素并不属于MainTimeline的子元素集合(numChildren),而是存储在对应图层的当前帧对象中,这就是为什么你只能看到一个固定的Shape,且每帧输出相同。
修正后的代码
import flash.display.DisplayObject; import flash.events.Event; import fl.motion.Layer; import fl.motion.Frame; var mainTimeline:MainTimeline = root as MainTimeline; addEventListener(Event.ENTER_FRAME, onFrameUpdate); function onFrameUpdate(e:Event):void { trace("========================"); trace("当前帧编号: " + mainTimeline.currentFrame); // 遍历所有图层 for (var layerIdx:int = 0; layerIdx < mainTimeline.timeline.layers.length; layerIdx++) { var targetLayer:Layer = mainTimeline.timeline.layers[layerIdx]; // 帧索引从0开始,currentFrame从1开始,所以需要减1 var currentFrame:Frame = targetLayer.frames[mainTimeline.currentFrame - 1]; if (currentFrame && currentFrame.elements.length > 0) { trace("--- 图层名称: " + targetLayer.name); // 遍历当前帧内的所有元素 for (var elemIdx:int = 0; elemIdx < currentFrame.elements.length; elemIdx++) { var elem:DisplayObject = currentFrame.elements[elemIdx] as DisplayObject; if (elem) { trace("元素类型: " + elem.constructor.name); trace("坐标: x=" + elem.x + ", y=" + elem.y); trace("尺寸: 宽=" + elem.width + ", 高=" + elem.height); trace("------------------------"); } } } } }
关键说明
- 正确的元素存储位置:
动画帧中的元素(图片/图形)都保存在对应图层的Frame对象的elements数组中,而非MainTimeline的直接子级。mainTimeline.timeline.layers可以获取文档中所有图层的集合。 - 帧索引的对应关系:
currentFrame是从1开始计数的,而图层的frames数组索引从0开始,所以需要用currentFrame - 1来获取当前帧的对象。 - 元素类型筛选:
如果你只需要输出图片(Bitmap),可以在遍历中增加判断:if (elem is Bitmap),过滤掉非位图元素。
额外优化建议
- 批量导出数据:面对280帧的大量数据,可使用
FileStream类将输出内容写入本地文本文件(需在AIR环境下运行,或调试时手动复制输出窗口内容)。 - 递归处理嵌套元素:若图片被放在MovieClip实例内部,需要递归遍历MovieClip的
numChildren,获取内部元素的坐标与尺寸。
内容的提问来源于stack exchange,提问作者GeorgePorge
相关产品推荐
相关产品推荐

