2

我有一个MovieClip,里面有图像,我可以拖动、调整大小和旋转。

我正在创建一个小拇指视图,因此用户可以看到它的外观。这本质上是主 MovieClip 的一个小版本。

如何将 MovieClip 克隆成一个较小的,这样当我在主 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 函数。

如果有人有更好/更快的方法,请告诉我;)

4

3 回答 3

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);
}
于 2009-07-03T15:45:43.457 回答
1

我的第一个解决方案是 BitmapData.draw() 但你说这太慢了。我认为唯一的另一条路线是将其外观传播到另一个电影剪辑,例如当您旋转它时有事件侦听器,并将缩略图上的旋转设置为匹配,这取决于您可以更改多少这可能需要很多工作. 所以 BitmapData.draw 可能是你最好的选择。我以前使用过 BitmapData.draw,它对我来说似乎从来没有慢过。

于 2009-07-02T04:21:39.787 回答
0

If your MovieClip can be created with only a constructor, you might try:

//(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;
}

It is not perfect (if your constructor needs arguments, or if the clip has been modified), but it is the best solution I have seen.

There is no explicit way in flash to clone a MC. :-(

于 2009-07-02T10:56:08.283 回答