我有一个带有和里面图像的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函数,调整大小,旋转。
如果有人有更好/更快的方式,请告诉我;)
答案 0 :(得分: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 :(得分:1)
我的第一个解决方案是BitmapData.draw(),但你说这太慢了。我认为唯一的其他路线是将其外观传播到另一个影片剪辑,例如旋转时有事件监听器,并设置thumnail上的旋转以匹配,具体取决于你可以改变多少,这可能需要很多工作。所以BitmapData.draw可能是你最好的选择。我之前使用过BitmapData.draw,它似乎从来没有对我表现得太慢。
答案 2 :(得分:0)
如果只使用构造函数创建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;
}
它不完美(如果你的构造函数需要参数,或者剪辑是否被修改过),但这是我见过的最佳解决方案。
在Flash中没有明确的方法来克隆MC。 : - (