是否可以同时制作循环Movieclip可点击和会话数据?

时间:2013-12-11 13:15:58

标签: actionscript-3 flash actionscript

我是AS3的新手,我正在努力实现以下情况。

首先,我收到JSON数据,对它们进行排序并将它们放入框中。每个框都有其数据集,例如Box1(Name1,Location1,Zip1),Box2(Name2,Location2,Zip2)等等。 将框放入另一个AS文件中进行显示,并将其放入视口滑块中。 试图使盒子可以点击,当点击一个盒子时,它将转到下一页并显示该特定“列表”的详细信息。

第一件事是,当电影剪辑框作为文件位于另一个内部时,如何使它可以被点击。

第二件事是,如何在单击时从该框中提取数据,因为它是由循环的JSON数据生成的。 (因为我需要使用列表中的ID将其解析为php以提取详细信息并在下一个文件中显示完整的详细信息。

谢谢你的时间!

生成框的AS文件。

package  com.clark
{
    import flash.display.MovieClip;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    public class SearchVectorTest extends MovieClip 
    {


        public function SearchVectorTest(test:Vector.<searchVO1>) 
        {
            super();

                for (var j:int = 0; j < test.length; j++) 
            {


                trace(test[j].nobed);
                trace(test[j].zip);
                trace(test[j].Location);
                trace(test[j].price);

        }
var len:int = test ? test.length : 0;

     listings = new Vector.<Listing8>(len, true);
            var currentY:int = 100;

            for (var k:int = 0; k < test.length; k++) 
            {
                var Bolder:Listing2 = new Listing2();

                Bolder.x=20;

                var bf:TextField = new TextField();
                var bf1:TextField = new TextField();
                var bf2:TextField = new TextField();
                var bf3:TextField = new TextField();

                bf3.width = 100;
                bf.defaultTextFormat = new TextFormat("Arial", 12, 0, null, null, null, null, null, TextFormatAlign.CENTER);

                bf.width = 100;
                bf.autoSize = TextFieldAutoSize.CENTER;
                bf1.width = 100;
                bf1.autoSize = TextFieldAutoSize.CENTER;
                bf2.autoSize = TextFieldAutoSize.CENTER;
                bf3.autoSize = TextFieldAutoSize.CENTER;
                bf3.width = 100;
                bf1.y= bf.height+5;


                bf.text = test[k].nobed;
                bf1.text = test[k].zip;
                bf2.text = test[k].Location;
                bf3.text = test[k].price;

                bf.x = (Bolder.height-bf.height)*.2
                Bolder.addChild(bf);
                Bolder.addChild(bf1);
                Bolder.addChild(bf2);
                Bolder.addChild(bf3);
                Bolder.properties = test[k].nobed;
            Bolder.properties = test[k].zip;

                // position the object based on the accumulating variable.
            Bolder.y = currentY;




                addChild(Bolder);
                 Bolder.mouseChildren = false;    // ignore children mouseEvents
            Bolder.mouseEnabled = true;      // enable mouse on the object - normally set to true by default
            Bolder.useHandCursor = true;     // add hand cursor on mouse over
            Bolder.buttonMode = true; 
                 listings[k] = Bolder;
                currentY += Bolder.height + 10;
            }

        }

    }

}

VectTest文件所在的AS文件

package com.clark

{

    import flash.display.*;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.display.Stage;
    import fl.controls.Button;




       public class sresultnologin extends MovieClip {

public var s1:Searchreult = new Searchreult ();

               public function sresultnologin(){
addEventListener(Event.ADDED_TO_STAGE, onadded);
         function onadded (event:Event):void{


            s1.x=-10;
            s1.y=10;

            addChild(s1);
         }

var s3:SearchVectorTest= new SearchVectorTest(new Vector.<searchVO1>);
                 addChild (s3);


            s1.SRhome.addEventListener(MouseEvent.CLICK, fl_ClickToGoTol);
            s1.ARsearch.addEventListener(MouseEvent.CLICK, fl_ClickToGosearch);


     if( s3.listings.length > 0 )
        {
            // get the first listing in the listing array
            var newListing:Listing8 = s3.listings[0];
            newListing.addEventListener(MouseEvent.CLICK, gotoscener);
        }
        else
        {                    
//
        }
                       }
               // private methods

        private function fl_ClickToGoTol(event:MouseEvent):void
        {

            var s9:Account = new Account ();    
    removeChild(s1);
            addChild(s9);

        }

        private function fl_ClickToGosearch(event:MouseEvent):void
        {

            var s9:searchVO1 = new searchVO1 ();    
    removeChild(s1);
            addChild(s9);


       }

}
}

编辑(在SearchVectorTest中添加)

var len:int = test ? test.length : 0;

         listings = new Vector.<Listing8>(len, true);

编辑(在sresultnologin中添加)

if( s3.listings.length > 0 )
        {
            // get the first listing in the listing array
            var newListing:Listing8 = s3.listings[0];
            newListing.addEventListener(MouseEvent.CLICK, gotoscener);
        }
        else
        {

//

        }

1 个答案:

答案 0 :(得分:0)

必须实例化“其他文件”(类),并且(作为DisplayObject)必须添加到舞台上才能显示。

考虑以下阶段布局:

root:MainTimeline ¬
    0: background:Shape
    1: listingWindow:Slider

sresultnologin(实例化时)看起来像这样:

this:sresultnologin ¬
    0: s3:SearchVectorTest ¬
        0: Bolder:Listing2 ¬
            0: bf:TextField
            1: bf1:TextField
            2: bf2:TextField
            3: bf3:TextField
    1: s1:Searchreult

你需要做的就是将addChild(sresultnologin)添加到舞台(或你的Slider),然后会出现这些子元素。

要使其可点击,只需通过object.addEventListener("mouseUp", listener)将听众附加到您的对象即可。这可以在任何时候完成:在SearchVectorTestsresultnologin的构造函数中,或者在单击“框”后将其添加到舞台中并显示新列表。如果您想从文档代码中执行此操作,则可能如下所示:

var newListing:Listing2 = listingWindow.getChildAt(0).getChildAt(0).getChildAt(0);
newListing.addEventListener("mouseUp", doStuff);

然而,这完全依赖于DisplayList索引(可能会发生巨大变化)。更好的解决方案可能是命名这些项目并使用getChildByName("string")代替。但是,如果每个对象都有非唯一的名称,那么这也是危险的。因此,如果您要从其中一个类(例如sresultnologin)中添加这些新列表,则可以在类上提供指向当前列表的属性,并从文档代码中引用该属性。 / p>

两个

JSON数据与AS3中的任何其他对象结构没有区别。如果需要,可以将其存储为类的属性,并在指定时间引用变量。如果您要将特定列表的特定数据存储在代表它的特定对象上,请尝试在Bolder中添加SearchVectorTest以下内容:

Bolder.properties = test[k];

编辑:

请记住,变量名称与对象上的name属性不同。换句话说......

var Bolder:Listing2 = new Listing2(); // variable is Bolder, of type Listing2
Bolder.name = "foo" // the name property on Bolder is now "foo"

getChildByName("Bolder") // this should fail since there is no object with that name
getChildByName("foo") // works.

只要你意识到这些差异,这并不复杂。 Please run the script I gave you(在“Pathing to Objects”下),显示您的舞台的层次结构。获得输出后,应该不言自明地说明了引用变量所需的路径。