2009-07-01 102 views
2

我有一個MovieClip和裏面的圖像,我可以拖動,調整大小和旋轉。實時克隆MovieClip

我創建了一個thumbview,所以用戶可以看看它將如何看。這實質上是主要MovieClip的一個小版本。

如何將影片剪輯克隆到較小的影片剪輯中,以便在拖動,旋轉或調整主影片剪輯中的影像時,小影片會隨更改而更新。

我試過BitmapData draw(),但它太慢了。

任何其他解決方案?

更新
這裏是我目前使用的代碼:

import flash.display.Bitmap; 
import flash.display.BitmapData; 

function createThumbnail() { 
    var bmd:BitmapData = new BitmapData(mcBig.width, mcBig.height, false, 0xFFBC1C);  
    bmd.draw(mcBig); 
    var b:Bitmap = new Bitmap(bmd); 
    b.smoothing = true; 
    b.scaleX = 0.2; 
    b.scaleY = b.scaleX; 
    mcSmall.addChild(b); 
} 

的createThumbnail函數被調用每拖動,縮放,旋轉。

如果有人有更好/更快的方式,讓我知道了;)

+0

我有一個很難相信一個BitmapData平局就太慢了,你也許可以發佈你正在使用 – grapefrukt 2009-07-02 10:58:26

+0

grapefrukt代碼:?我添加的代碼 – 2009-07-02 14:45:41

回答

4

BitmapData繪圖速度非常快,你應該嘗試修改你的createThumbnail來重用位圖並重新繪製它,對象實例化是一個很大的打擊,所以如果你每創建一個新的BitmapData和Bitmap 。幀,這可能是你的問題的根源

import flash.display.Bitmap; 
import flash.display.BitmapData; 

private var _myThumb:Bitmap;   // you'll probably want to have one of these for each mcSmall instance, instead of a class-level variable - this is just here for sample reference 
private var _myThumbData:BitmapData; 

function createThumb() { 
    _myThumbData = new BitmapData(mcBig.width, mcBig.height, false, 0xFFBC1C); 
    _myThumb = new Bitmap(_myThumbData); 
    _myThumb.smoothing = true; 
    _myThumb.scaleX = _myThumb.scaleY = 0.2 
    mySmall.addChild(_myThumb); 
} 

createThumb(); // call this just once per thumbnail 

function createThumbnail() { //call this every draw frame 
     _myThumbData.draw(mcBig); 
} 
1

我的第一個解決方案將是的BitmapData.draw(),但你說的太慢。我認爲唯一的其他途徑是將其外觀傳播到另一個電影剪輯,例如,當你旋轉它時有事件監聽器,並且在thumnail上設置旋轉以匹配,這取決於你可以改變多少,這可能需要很多工作。所以BitmapData.draw可能是您的最佳選擇。我之前使用過BitmapData.draw,它對我來說似乎沒有任何影響。

0

如果你的影片剪輯可以只用一個構造函數來創建的,你可以嘗試:

//(stolen from http://www.dannyburbol.com/2009/01/movieclip-clone-flash-as3/) 
public function duplicateDisplayObject(
           source:DisplayObject, 
           autoAdd:Boolean = false 
           ):DisplayObject 
{ 
    // create duplicate 
    var sourceClass:Class = Object(source).constructor; 
    var duplicate:DisplayObject = new sourceClass(); 

    // duplicate properties 
    duplicate.transform = source.transform; 
    duplicate.filters = source.filters; 
    duplicate.cacheAsBitmap = source.cacheAsBitmap; 
    duplicate.opaqueBackground = source.opaqueBackground; 
    if (source.scale9Grid) { 
     var rect:Rectangle = source.scale9Grid; 
     // WAS Flash 9 bug where returned scale9Grid is 20x larger than assigned 
     // rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20; 
     duplicate.scale9Grid = rect; 
    } 

    // add to source parent’s display list 
    // if autoAdd was provided as true 
    if (autoAdd && source.parent) { 
     source.parent.addChild(duplicate); 
    } 
    return duplicate; 
} 

它不是完美的(如果你的構造需要的參數,或者如果夾子已被修改),但它是我見過的最佳解決方案。

在Flash中沒有明確的方式克隆MC。 :-(