FLASH AS3:以编程方式删除关键帧

Posted

技术标签:

【中文标题】FLASH AS3:以编程方式删除关键帧【英文标题】:FLASH AS3: Delete keyframes programmatically 【发布时间】:2012-02-03 09:28:06 【问题描述】:

这是我想要做的: 我有一个带有简单淡入淡出过渡的图片幻灯片。我没有源文件,我想从幻灯片中提取所有单张图片。我已将视频导入 Flash,以便视频中的所有图像都是关键帧。

所以现在,我有一部电影有大约 10,000 个关键帧。我有一个我不想要的已知关键帧间隔(当图片单独在一个帧上并且它没有与另一张图片转换时)。

我可以:

    删除关键帧间隔 使用我想要的关键帧创建一个新的影片剪辑/文档/场景...

任何建议都会非常有帮助!谢谢

【问题讨论】:

【参考方案1】:

您无法按照自己的意愿复制关键帧,但我可以为您提供一种播放电影/影片剪辑的方法,无需多余的帧。

首先你应该在 EnterFrame 上添加一个事件监听器:

addEventListener(Event.ENTER_FRAME, onEnterFrame);

然后你可以写一个方法来定义你的有效帧:

private function isValidFrame(frameIndex:uint):Boolean

    return frameIndex > 10       //range start
            && frameIndex < 3000 //range end 
            && [62, 15, 337].indexOf(frameIndex) == -1;//add forbidden frames here

最后,您可以编写您的 enterframe 监听器:

private function onEnterFrame(e:Event):void

    var frameIndex:uint = this.currentFrame;
    while (!isValidFrame(frameIndex))
    
        frameIndex++;
        if (frameIndex >= 10000)
        
            //stop everything
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        
    
    gotoAndStop(frameIndex);

干杯!

【讨论】:

【参考方案2】:

为什么要删除关键帧?您可以直接转到您想要的确切关键帧并从该帧的影片剪辑制作位图副本。 下面是我打算从 DisplayObjects 制作位图副本的一个小 util 类:

package
import flash.display.DisplayObject;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

public final class Cropper

    public function Cropper():void

    public static function crop(_x, _y, _w:Number, _h:Number, displayObject:DisplayObject):Bitmap
    
        var cropArea:Rectangle = new Rectangle(_x, _y, _w, _h);
        var croppedBitmap:Bitmap = new Bitmap(new BitmapData(_w, _h, true, 0x00000000));

        var dispObjData:BitmapData = new BitmapData(displayObject.width, displayObject.height, true, 0x00000000);
        dispObjData.draw(displayObject);

        croppedBitmap.bitmapData.copyPixels(dispObjData, cropArea, new Point(0, 0), null, null, true);

        return croppedBitmap;
    

您可以在循环中使用它来迭代关键帧数组并制作副本,就像这样:

var arr:Array = new Array(1, 10, 20, 30, 40...);
for(var i:int = 0; i < arr.length; i++)
yourDisplayObject.gotoAndStop(arr[i]);
var cropPic:Bitmap = Cropper.crop(x, y, width, height, displayObjectToCopy);

告诉我它是否适合你...

【讨论】:

以上是关于FLASH AS3:以编程方式删除关键帧的主要内容,如果未能解决你的问题,请参考以下文章

flash as3 第一次按下按钮没有反应

离开关键帧并返回时,Flash 舞台上的 MovieClip 不会重新实例化

在Flash中动画的制作方式:

flash动画有几种基本类型?

Flash中帧的类型有( )种。

flash动画包括哪两种形式?这两种形式的特点分别是啥?