实时克隆影片剪辑
Posted
技术标签:
【中文标题】实时克隆影片剪辑【英文标题】:Clone MovieClip in realtime 【发布时间】:2010-11-07 10:50:03 【问题描述】:我有一个 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 函数。
如果有人有更好/更快的方法,请告诉我;)
【问题讨论】:
我很难相信位图数据绘制会太慢。您可以发布您正在使用的代码吗? grapefrukt:我已将代码添加到我的帖子中。 如果您不受 Flash Player 9 的限制,您可以使用智能库对图像进行重新采样,以便在调整大小时缩略图看起来清晰。双三次(更锐利)应该这样做。看看这里:clevrlib.riaforge.org 和这里:***sandrus.com/blog/2009/03/11/…。祝你好运! 【参考方案1】:我的第一个解决方案是 BitmapData.draw() 但你说这太慢了。我认为唯一的其他途径是将其外观传播到另一个电影剪辑,例如当您旋转它时有事件侦听器,并将缩略图上的旋转设置为匹配,这取决于您可以更改多少,这可能需要大量工作。所以 BitmapData.draw 可能是你最好的选择。我以前使用过 BitmapData.draw,但它对我来说似乎从来没有慢过。
【讨论】:
【参考方案2】:如果您的 MovieClip 可以仅使用构造函数创建,您可以尝试:
//(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;
它并不完美(如果您的构造函数需要参数,或者剪辑已被修改),但这是我见过的最好的解决方案。
闪存中没有明确的方法来克隆 MC。 :-(
【讨论】:
【参考方案3】: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。以上是关于实时克隆影片剪辑的主要内容,如果未能解决你的问题,请参考以下文章