在单独的类中指定转换

时间:2010-12-11 22:59:07

标签: actionscript-3

我有一个问题,但有点难以解释,如果不清楚,请随意发表评论。

我有一个看起来如下的功能:

private function createContent(slideData:Object):void 
        {
            if (slide){

                removeChild(slide);
            }
            slide  = new Slide(slideData);
                addChild(slide);

        }

现在,当我删除或添加幻灯片时,我希望它以转换形式出现,我想创建一个单独的类来使用tweenlite放置不同的转换。我最好如何处理这个问题?总而言之,当我添加或删除子项时,将调用过渡类,它会返回一个过渡,并在添加或删除幻灯片时对其进行动画处理。

2 个答案:

答案 0 :(得分:0)

处理此问题的一种方法是实现在添加或删除幻灯片时可以调用的方法。我不确定使用特定类进行转换会有所帮助,但无论如何,您可以将转换对象作为参数传递给函数。

如果转换对象为空,您还可以添加条件,只需添加或删除幻灯片,并且不会调用Tweenlite ...

public function displaySlide(container:DisplayObjectContainer , 
                            transition:Object , show:Boolean):void
{
 //The show Boolean indicates if you add 
 //or remove the slide. If removing the slide
 //you'll need the value in the transitionComplete method
 this.show = show;

 if( show )
      container.addChild( this );

 //The duration value as a property of your transition Object
 TweenLite.to( this , transition.duration , transition );
}

public transitionComplete():void
{
  if( !show )
    this.parent.removeChild( this );

  dispatch( new Event ("Transition complete") );
}

然后您可以像这样使用它:

 private function createContent(slideData:Object):void 
 {
        if (this.contains( slide )){

            slide.addEventListener( "Transition Complete" , completeHandler );
            slide.displaySlide( this , slideData , false );
        } 
 }

答案 1 :(得分:0)

您接近它的方式可能类似于以下示例:

您将创建类Main(文档类),com.vincent.Slides和com.vincent.Slide。

package
{
    import com.vincent.Slides;
    import flash.display.MovieClip;

    public class Main extends MovieClip
    {
        public function Main():void
        {
            init();

        }// end function

        private function init():void
        {
            var slides:Slides = new Slides(550, 400, [0xFF0000, 0x00FF00, 0x0000FF]);
            addChild(slides);

        }// end function

    }// end class

}// end package

在Main类中,您将导入Slides类并创建它的实例。幻灯片类的参数是幻灯片的宽度,高度和颜色。对于此示例,我使用颜色而不是加载内容以保持Flash应用/电影简单。最后,您将Slides实例添加到舞台。

package com.vincent
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class Slides extends Sprite
    {
        private var _width:Number;
        private var _height:Number;
        private var _slideColors:Array;
        private var _slides:Array;
        private var _currentSlide:int = 1;
        private var _leftControl:Sprite;
        private var _rightControl:Sprite;
        private var _isSliding:Boolean;

        public function Slides(p_width:Number, p_height:Number, p_slideColors:Array):void
        {
            _width = p_width;
            _height = p_height;
            _slideColors = p_slideColors;

            init();

        }// end function

        private function init():void
        {
            addSlides();
            addControls();
            addMask();

            addEventListener(Event.ENTER_FRAME, enterFrameHandler);

        }// end function

        private function addSlides():void
        {
            _slides = new Array();

            for(var i:uint = 0; i < _slideColors.length; i++)
            {
                var slide:Slide = new Slide(_width, _height, _slideColors[i]);
                slide.x = _width * i;
                addChild(slide);

                _slides.push(slide);

            }// end for

        }// end function

        private function addControls():void
        {
            _leftControl = new Sprite();
            _leftControl.graphics.beginFill(0x000000, 0);
            _leftControl.graphics.drawRect(0, 0, 50, _height);
            _leftControl.graphics.endFill();
            addChild(_leftControl);

            var _rightControl:Sprite = new Sprite();
            _rightControl.graphics.beginFill(0x000000, 0);
            _rightControl.graphics.drawRect(0, 0, 50, _width);
            _rightControl.graphics.endFill();
            _rightControl.x = _width - _rightControl.width;
            addChild(_rightControl);

            _leftControl.addEventListener(MouseEvent.CLICK, mouseClickHandler);
            _rightControl.addEventListener(MouseEvent.CLICK,  mouseClickHandler);

        }// end function 

        private function mouseClickHandler(e:MouseEvent):void
        {
            if(!_isSliding)
            {
                if(e.currentTarget == _leftControl)
                {
                    slideLeft();
                }
                else
                {
                    slideRight();

                }// end if

            }// end if

        }// end function

        private function slideLeft():void
        {
            if(!(_currentSlide <= 1))
            { 
                for(var i:uint = 0; i < _slides.length; i++)
                {
                    _slides[i].tweenLeft();

                }// end for

                _currentSlide--;

            }// end if

        }// end function

        private function slideRight():void
        {
            if(!(_currentSlide >= _slides.length))
            {
                for(var i:uint = 0; i < _slides.length; i++)
                {
                    _slides[i].tweenRight();

                }// end for

                _currentSlide++;

            }// end if

        }// end function

        private function addMask():void
        {
            var maskSprite:Sprite = new Sprite();
            maskSprite.graphics.beginFill(0x000000);
            maskSprite.graphics.drawRect(0, 0, _width, _height);
            maskSprite.graphics.endFill();
            addChild(maskSprite);

            this.mask = maskSprite;

        }// end function

        private function enterFrameHandler(e:Event):void
        {
            if(_slides[0].isSliding)
            {
                _isSliding = true;

            }
            else
            {
                _isSliding = false;

            }// end if else

        }// end function

    }// end class

} //结束包

在Slides类中,您将导入Sprite,Event和MouseEvent类。请注意,我不需要导入Slide类,因为它是一个内部类。内部类可由同一包中的所有类访问。接下来,您将扩展Slides类的Sprite类。

之后,您将声明私有属性:_width和_height,其中包含显示对象的宽度和高度; _slideColors包含每个幻灯片颜色的数组; _currentSlide表示当前幻灯片编号; _leftControl和_rightControl是用于在点击时左右滑动幻灯片的控件;最后,如果幻灯片正在滑动,则_isSliding设置为true,否则设置为false。

对于Slide类的初始化,您将为Slides属性分配相应的Slides参数。然后在第一个调用init()的方法中调用addSlides()方法。

在addSlides()方法中,_slides属性是实例化的。接下来,使用for循环遍历_slideColors数组中的所有幻灯片颜色,并创建添加到舞台并将其添加到_slides数组的Slide实例。在创建每个幻灯片实例时,会将宽度,高度和幻灯片颜色解析为它,并且每个幻灯片都位于上一张幻灯片的右侧。

在调用addSlides()方法之后,init()方法中调用的下一个方法是addControls()。在addControls()方法中,绘制_leftControl和_rightControl精灵并将其添加到幻灯片显示对象。它们是不可见的并且定位于幻灯片显示对象的左右边缘(分别)。接下来,您将向控件添加事件侦听器,以便在用户单击它时进行侦听。当用户单击它时,将调用mouseClickHandler()方法。

在mouseClickHandler()方法中,有一个条件语句,用于检查幻灯片是否在滑动。如果不是,则另一个条件语句检查单击了哪个控件并调用相应的slideLeft()或slideRight()方法。

在slideLeft()和slideRight()方法中,有一个条件语句,用于检查当前幻灯片是不是第一张幻灯片还是最后一张幻灯片。如果不是,则为_slides数组中的所有幻灯片调用方法tweenLeft()或tweenRight()。之后,_currentSlide属性递增或递减1.

在调用addControls()方法之后,init()方法中调用的下一个方法是addMask()。这只是为Sprites显示对象添加一个遮罩,因此您一次只能看到一张幻灯片。

在调用addMask()方法之后,init()方法中调用的下一个方法是addMask()。这只是为Sprites显示对象添加一个遮罩,因此您一次只能看到一张幻灯片。

最后,在调用addMask()方法之后,添加一个输入帧事件侦听器,该侦听器重复触发方法enterFrameHandler()。

在enterFrameHandler()方法中,您有一个条件语句,用于检查幻灯片是否正在滑动,并为_isSliding属性指定true或false。

package com.vincent
{
    import com.greensock.TweenLite;
    import flash.display.Sprite;

    internal class Slide extends Sprite
    {
        private var _width:Number;
        private var _height:Number;
        private var _slideColor:uint;
        private var _isSliding:Boolean;

        public function get isSliding():Boolean
        {
            return _isSliding;

        }// end function

        public function Slide(p_width:Number, p_height:Number, p_slideColor:uint):void
        {
            _width = p_width;
            _height = p_height;
            _slideColor = p_slideColor;

            init();

        }// end function

        private function init():void
        {
            var slideContent:Sprite = new Sprite();
            slideContent.graphics.beginFill(_slideColor);
            slideContent.graphics.drawRect(0, 0, _width, _height);
            slideContent.graphics.endFill();
            addChild(slideContent);

        }// end function

        public function tweenLeft():void
        {
            _isSliding = true;

            TweenLite.to(this, 1, {x: this.x + _width, onComplete: onTweenComplete});

        }// end function 

        public function tweenRight():void
        {
            _isSliding = true;

            TweenLite.to(this, 1, {x: this.x - _width, onComplete: onTweenComplete});

        }// end function 

        private function onTweenComplete():void
        {
            _isSliding = false;

        }// end function

    }// end class

}// end package

这是您将用于Slide类的代码。

有了这个,这个例子就完整而且有效。说实话,这个问题有点难以理解,所以我给出了一个使用TweenLite幻灯片的非常一般的例子,希望你能从中汲取一些东西。通过使用此方法,您可以通过编辑Slide类中的TweenLite.to()方法来更改每张幻灯片的补间效果。如果您可以从您的Flash应用程序/电影中添加更多代码或链接到它,它可以帮助您获得更好的答案。我知道这肯定会帮助我给你一个更好的。如果您对该示例有疑问,请发表评论或与我联系(我的联系信息在我的个人资料中)。

我希望这有助于:)