我正在构建一个自定义图像选择器,它显示了6个替代版本。但是照片只显示在第6个项目上。
_model.selectedPhoto
会返回一个Sprite,并且不会让该应用正常运行。
但是,当我使用_model.photos[ii]
时,每张照片都会添加一张照片 - 为什么会这样?我需要为每个_model.selectedPhoto
s:Sprite
for (var ii:int; ii < 6; ii++)
{
//Create BG
var s:Sprite = new Sprite();
s.graphics.beginFill(Math.random() * 0xffffff, 0.4);
s.graphics.drawRect(0, 0, 291, 184);
//add Photo
var p:Sprite = new Sprite();
p.addChild(_model.selectedPhoto);
p.scaleX = p.scaleY = 0.2;
p.x = 0;
p.y = 0;
s.addChild(p);
cards.push(s);
}
答案 0 :(得分:3)
嗯,它只显示第6个项目上的一张照片,因为你正在运行6次for循环并连续将所选照片添加到每个新的精灵中。您会看到将显示对象添加到另一个显示对象,然后将该显示对象添加到其他显示对象时,将从第一个显示对象中提取原始项并将其添加到下一个显示对象。我知道在写这种方式时可能很难理解,所以让我们这样打破:
var photo:Sprite = new Sprite();
var container1:Sprite = new Sprite();
var container2:Sprite = new Sprite();
//Add to the first container
container1.addChild(photo);
//At this point when you add to the next container, the object is removed from container1 and placed inside container 2
container2.addChild(photo);
这就是为什么当你使用_model.photos [ii]时,你为你的for循环中的6个新容器精灵中的每一个添加了一个独特的图片,因为每个容器都有独特的项目。您正在使用数组索引(ii var)访问这些唯一项目,该索引随每个循环递增。
如果要为每六个项目添加相同的图片,那么您将需要复制原始图片的数据6次。一种方法是使用URLLoader对象并重新加载构成原始图片的二进制数据。你这样做是这样的:
var originalPictureLoader:URLLoader = new URLLoader();
originalPictureLoader.addEventListener(Event.COMPLETE, originalPictureLoaded);
originalPictureLoader.dataFormat = URLLoaderDataFormat.BINARY;
originalPicture.load(new URLRequest("http://www.mysite.com/picture.jpg"));
private function originalPictureLoaded(e:Event):void
{
var pictureBytes:ByteArray = URLLoader(e.currentTarget).data as ByteArray;
var imageDiplicateLoader:Loader;
for (var ii:int; ii < 6; ii++)
{
//Create BG
var s:Sprite = new Sprite();
s.graphics.beginFill(Math.random() * 0xffffff, 0.4);
s.graphics.drawRect(0, 0, 291, 184);
//add Photo
var p:Sprite = new Sprite();
imageDiplicateLoader = new Loader();
imageDiplicateLoader.loadBytes(pictureBytes);
p.addChild(imageDiplicateLoader);
p.scaleX = p.scaleY = 0.2;
p.x = 0;
p.y = 0;
s.addChild(p);
cards.push(s);
}
}
现在请记住,这只是一种方法而且我已经把它写在了我的头顶。所以,我不确定你可能需要复制for循环中的pictureBytes数据,但我不相信。如果你必须这样做,你就是这样做的:
var bytesCopy:ByteArray = new ByteArray();
pictureBytes.position = 0;
bytesCopy.writeBytes(pictureBytes);
答案 1 :(得分:2)
我不确定我是否完全理解你的代码,但有一件事是肯定的;一个DisplayObject(在你的情况下是一个Sprite)不能有多个父级,因此,如果你尝试addChild它在第二个位置它将失败。这可能是你的问题。