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

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

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

我可以:

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

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

【问题讨论】:

    标签: flash actionscript-3 video actionscript slideshow


    【解决方案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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 2010-12-29
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多