动作脚本3:动态添加约束到容器的动画片段

时间:2010-10-16 23:06:59

标签: actionscript-3 for-loop actionscript image-gallery

上次修改:已解决!

好吧,我无法在这里找到完整的答案,但我终于得到了我想要的东西。非常感谢你的帮助和耐心。

作为旁注:我想我可能在使用int和Number类型时遇到问题,仔细检查我的解决方案后,我意识到Number正在使用而不是int。原来数字包含浮点数而int则没有。每当我试图解决这个问题时,我的数字可能都在四舍五入。据我所知,TDI的答案可能一直存在,并且使用int填充可能已经累积了数字。哦,你每天都学到一些东西..

以我正在寻找的方式将影片剪辑限制为容器影片剪辑(或精灵或其他)的正确代码是:

var picContainer:PicContainer = new PicContainer();
picContainer.x = stage.stageWidth / 2 - picContainer.width / 2;
picContainer.y = stage.stageHeight / 2 - picContainer.height / 2;
addChild(picContainer);

var totalPics:int = 17;

var pic:Pic = new Pic(); //make an instance just to get its width

var xRange:Number = picContainer.width - pic.width;
var spacing:Number = xRange / (totalPics - 1);

//A little optimization: only need to calculate this number ONCE:
var yLoc:Number = picContainer.height / 2 - pic.height / 2;

for(var i:int = 0; i < totalPics; i++) {
    pic = new Pic();
    pic.x = i * spacing;
    pic.y = yLoc;
    picContainer.addChild(pic);
}

逻辑很简单,我不知道为什么我不能把它当作自己,因为我绘制的图表确切地说明了这个逻辑。但是,我不能把这些数字放在正确的地方,否则我就不会问,是吗?P

奖金内容! 作为一个额外的奖励(如果有人发现这个线程寻找答案..) 您还可以使用此代码将'pic的扇形从中心点移出(但它们仍然按照从左到右的顺序排列):

var picContainer:PicContainer = new PicContainer();
picContainer.x = stage.stageWidth / 2 - picContainer.width / 2;
picContainer.y = stage.stageHeight / 2 - picContainer.height / 2;
addChild(picContainer);

var totalPics:int = 5;

var pic:Pic = new Pic(); //make an instance just to get its width

var padding:Number = (picContainer.width - (pic.width * totalPics))  / (totalPics + 1);

for(var i:int = 0; i < totalPics; i++) {
    pic = new Pic();
    pic.x = padding + i * (pic.width + padding);
    pic.y = picContainer.height / 2 - pic.height / 2;
    picContainer.addChild(pic);
}

尝试一下,这些可以用于很棒的缩略图停靠引擎!

First Edit:嗯,由于TDI有一些进展,但不是一个完整的解决方案。

你知道,问题仍然存在,影片片段并没有完全压入容器,最后一两个片段仍未完成。

example:

alt text

我修改后的代码如下所示:

var newPicContainer:picContainer = new picContainer();
var newPic:pic;

var picwidth:int = 100;
var amountofpics:int = 22;
var i:int;

//add a container
addChild(newPicContainer);

//center our container
newPicContainer.x = (stage.stageWidth/2)- (newPicContainer.width/2);
newPicContainer.y = (stage.stageHeight/2)- (newPicContainer.height/2);

var totalpicwidth:int = picwidth*amountofpics;

var totalpadding:int = newPicContainer.width - totalpicwidth;

var paddingbetween:int = (totalpadding / amountofpics);

for (i = 0; i < amountofpics; ++i)
{
    //make a new mc called newPic(and i's value)  eg. newPic1
    this['newPic' + i] = new pic();
    this['newPic' + i].width = picwidth;

    //add our pic to the container
    newPicContainer.addChild(this['newPic' + i]);

    //set the new pics X
    if (i != 0)
    {
        // if i is not 0, set newpic(i)s x to the previous pic plus the previous pics width and add our dynamic padding 
        this['newPic' + i].x = this['newPic' + (i-1)].x + picwidth + paddingbetween;
    }
    else
    {
        this['newPic' + i].x = 0;
    }
}

再次感谢任何人!

原帖:

你好,第一次在这里发帖。我希望我没有弄错。我的问题如下:

我有一个非常基本的for循环,它创建了一个'thumbnail'并将它放在包含影片剪辑的前一个(带有一点填充)旁边。

var newPicContainer:picContainer = new picContainer();
var newPic:pic;
var amount:int = 9;
var i:int;

//Add our container
addChild(newPicContainer);

//center our container
newPicContainer.x = (stage.stageWidth/2)- (newPicContainer.width/2);
newPicContainer.y = (stage.stageHeight/2)- (newPicContainer.height/2);


for (i = 0; i < amount; ++i)
{
 newPic = new pic();
 newPicContainer.addChild(newPic);

    //just so i know it's adding them..
    trace(newPic.thisOne);
 newPic.thisOne = i;

    // set this one to its self (+5 for padding..) Times, the amount already placed. 
 newPic.x = (newPic.width+5) *i;
}

我想知道是否有一些等式或'魔术数学',我可以用它来弄清楚容器的长度是多少,并且相对于那个数字添加'缩略图'。基本上将缩略图相互挤压,使它们都适合内部..

类似于:

newPic.x = (newPic.width *i) - stuff here to make it know not to go past the containing width;

我必须承认我对数学不太好,所以编码的这部分让我感到很沮丧。

感谢提前任何人......

3 个答案:

答案 0 :(得分:2)

您可以通过显式调用width属性来获取容器的长度:

//Container Width    
newPicContainer.width;

或newContainer也是添加的图片的父级:

//Container Width    
newPic.parent.width;

然后你需要得到你的照片占用的总长度:

var arrayOfPics:array = [pic1, pic2, pic3, pic4, pic5];
var picsWidth:Number;

for each (var element:pic in arrayOfPics)
         picsWidth =+ element.width;

之后,您可以从容器中减去总图片的长度,以了解可用的分隔填充:

var totalPadding:Number = newPicContainer.width - picsWidth;

现在您可以通过将totalPadding除以图片数量来确定图片与容器两面之间可以承受多少填充,并为结尾添加额外的填充。

var padding:Number = totalPadding / arrayOfPics.length + 1;

现在您可以通过添加填充

来添加您的照片
for (var i:int = 0; i < arrayOfPics.length; i++)
    {
    newPicContainer.addChild(arrayOfPics[i]);
    (i == 0) ? arrayOfPics[i].x = padding : arrayOfPics[i].x = arrayOfPics[i - 1].x + arrayOfPics[i - 1].width + padding;
    }

答案 1 :(得分:1)

试试这个......

 //maximum available length
 var maxLength:int; 

 // a single thumbnail width
 var picWidth:int = 100;

 // total number of pics in a container
 var maxNumPics:int;

 // as long as the maximum available length
 // is inferior to the container length 
 // add a new thumbnail
 while( maxLength < newPicContainer.length - 100 )
 { 
    maxLength += 100;
    maxNumPics += 1;
 } 

 // calculate the amount of available padding.
 var padding:Number =  ( newPicContainer.length - maxLength )/ maxNumPics; 

 //add your thumbs
 var picX:int;

 for( var i:int ; i < maxNumPics ; ++i )
 {
     var newPic:Pic = new Pic();
     newPic.x = picX;

     picX += padding + picWidth;
     newPicContainer.addChild( newPic ); 
 }

答案 2 :(得分:0)

我建议你看一下使用Flex框架(它是一个Flash框架),它会使构建这种视图变得更加容易。

您可以设置容器的布局属性,以便将项目放置在水平,垂直或平铺布局中,然后只将项目添加到容器中。

有关Flex look here

的更多信息

info on Flex Layouts