as3.0 电子相册

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.geom.Point;
    import flash.display.Shape;
    import flash.geom.Matrix;
    import flash.display.GradientType;
    import flash.events.MouseEvent;
    import flash.display.DisplayObject;
    import com.greensock.TweenLite;
    import com.greensock.easing.*;

    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.utils.getDefinitionByName
    import flash.utils.getQualifiedClassName
    import flash.display.StageDisplayState
 
    public class Main extends Sprite
    {
        private var num:uint;
        private var rx:Number = 1700;//每张图片的间隔(或者说所有图片的宽度)
        
        private var ry:Number = 0.8;//初始状态的时候图片的大小
        private var pics:Array = new Array();
        private var picslength:int;
        private var speed:Number;
        private var j:int = -1;
        private var picw:Number;
        private var pich:Number;
        private var picz:int = 2;
        private var stagew:Number;
        private var stageh:Number;
        private var scalex:Number;
        private var scaley:Number;
        private var displayobject1:DisplayObject;
        private var displayobject2:DisplayObject;

        private var clickCount:int = 0;
        private var thisMc:MovieClip
        private var stageMc:Stage
        private var emptyMc:MovieClip
        private var speedNum:Number=70000//图片左右循环的速度
        private var enlarge:Number=2.5//鼠标移动到图片上放大的倍数
        public function Main(_thisMc:MovieClip,_stageMc:Stage,_emptyMc:MovieClip):void
        {
            emptyMc=_emptyMc
            stageMc=_stageMc
            thisMc=_thisMc
            init();
            
            stageMc.displayState=StageDisplayState.FULL_SCREEN
        }
        private function init():void
        {
        //    var bitmapdata:pic2 = new pic2();
            
            stagew = stageMc.stageWidth / 2;
            stageh = stageMc.stageHeight / 2;
            num = 5;
            for(var i:int =1;i<=num;i++)
            {
        //    var bitmapdata:BitmapData= getChildByName("pic"+num) as BitmapData;
                
                var newClass:Class = getDefinitionByName("pic"+i) as Class;
var bitmapdata:BitmapData = new newClass();
                //trace(getDefinitionByName("pic"+i),i)
              com(bitmapdata);
            }
            stageMc.addEventListener(Event.ENTER_FRAME,onFrameHandler);
        }
        private function com(bmpdt:BitmapData):void
        {
            j++;
            var bitmap:Bitmap = new Bitmap(bmpdt);
            if ((j == 0))
            {
                picw = bitmap.width;
                pich = bitmap.height;
            }
            var topshape:Shape = new Shape();
            var spritecont:Sprite = new Sprite();
           emptyMc. addChild(spritecont);
            DrawInSprite(topshape,bitmap);
            topshape.x =  -  picw / 2;
            topshape.y =  -  pich / 2;
            spritecont.addChild(topshape);
        //    DrawRef(topshape);//倒影
         //   spritecont.addEventListener(MouseEvent.ROLL_OVER,roll_over);
           // spritecont.addEventListener(MouseEvent.ROLL_OUT,roll_out);
            spritecont.addEventListener(MouseEvent.CLICK,mouseclick);
 
            var obj:Object = {"spritecont":spritecont,"arg":j * Math.PI * 2 / num};
            pics.push(obj);
            spritecont.x = rx * Math.cos(obj.arg) + stagew;
            spritecont.y =  -  ry * Math.sin(obj.arg) + stageh;
            spritecont.z = 2500;
            spritecont.scaleX = spritecont.scaleY = spritecont.y - stageh + ry;
            if ((j == (num - 1)))
            {
                picslength = pics.length;
            }
        }
        private function roll_over(evt:MouseEvent):void
        {
            displayobject1 = evt.target as DisplayObject;
            scalex = evt.target.scaleX;
            scaley = evt.target.scaleY;
            evt.target.parent.setChildIndex(evt.target,evt.target.parent.numChildren - 1);
            TweenLite.to(evt.target,1,{scaleX:enlarge,scaleY:enlarge,ease:Back.easeOut});
        }
        private function roll_out(evt:MouseEvent):void
        {
            displayobject1 = null;
            displayobject2 = evt.target as DisplayObject;
            TweenLite.to(evt.target,1,{scaleX:getScale(displayobject2),scaleY:getScale(displayobject2),ease:Back.easeOut,onComplete:onFinishTween});
        }
        private function mouseclick(evt:MouseEvent):void
        {
            //待添加...
        }
        private function getScale(displayobject:DisplayObject):Number
        {
            if (Math.abs(speed) >= 0.04)
            {
                return 0;
            }
            else
            {
                return displayobject.y - stageh + ry;
            }
        }
        private function onFinishTween():void
        {
            displayobject2 = null;
        }
        private function DrawRef(p_source:DisplayObject):void
        {
            //对源显示对象做上下反转处理
            var bd:BitmapData = new BitmapData(p_source.width,p_source.height,true,0);
            var mtx:Matrix = new Matrix();
            mtx.d = -1;
            mtx.ty = bd.height;
            bd.draw(p_source,mtx);
            //生成一个渐变遮罩
            var width:int = bd.width;
            var height:int = bd.height;
            mtx = new Matrix();
            mtx.createGradientBox(width,height,0.5 * Math.PI);
            var shape:Shape = new Shape();
            shape.graphics.beginGradientFill(GradientType.LINEAR,[0xff0000,0xff0000],[0.5,0],[0,255],mtx);
            shape.graphics.drawRect(0,0,width,height);
            shape.graphics.endFill();
            var mask_bd:BitmapData = new BitmapData(width,height,true,0);
            mask_bd.draw(shape);
            //生成最终效果;
            bd.copyPixels(bd,bd.rect,new Point(0,0),mask_bd,new Point(0,0),false);
            //将倒影位图放在源显示对象下面
            var ref:Bitmap = new Bitmap();
            ref.x = p_source.x;
            ref.y = p_source.height / 2;
            ref.bitmapData = bd;
            p_source.parent.addChild(ref);
        }
        private function DrawInSprite(shape:Shape,bitmap:Bitmap):void
        {
            // 图片的描边
            //shape.graphics.lineStyle(1,0xffffff);
            shape.graphics.beginBitmapFill(bitmap.bitmapData);
            shape.graphics.drawRect(0,0,picw,pich);
            shape.graphics.endFill();
        }
        private function onFrameHandler(evt:Event):void
        {
            speed = (thisMc.mouseX - stagew)/speedNum;
            refreshIndex();
            refreshPosition();
        }
        private function refreshIndex():void
        {
            var gap:int = 1;
            var left:int = 0;
            var right:int = 0;
            var temp:Object;
 
            while ((gap <= picslength / 3))
            {
                gap = gap * 3 + 1;
            }
 
            while ((gap > 0))
            {
                for (right = gap; right < picslength; right++)
                {
                    temp = pics[right];
                    left = right;
                    if (displayobject1 != pics[right]["spritecont"])
                    {
                        while (((left > gap - 1) && Number(pics[left - gap]["spritecont"].y) >= Number(temp["spritecont"].y)))
                        {
                            pics[left] = pics[left - gap];
                            left -=  gap;
                        }
                        pics[left] = temp;
                    }
                }
                gap = (gap - 1) / 3;
            }
        }
        private function refreshPosition():void
        {
            for (var i:int = 0; i < picslength; i++)
            {
                var obj:Object = pics[i];
                var spritecont:Sprite = obj.spritecont as Sprite;
                obj.arg +=  speed;
                spritecont.x = rx * Math.cos(obj.arg) + stagew;
                spritecont.y =  -  ry * Math.sin(obj.arg) + stageh;
                if (displayobject1 != spritecont && displayobject2 != spritecont)
                {
                    spritecont.parent.setChildIndex(spritecont,i);
                    spritecont.scaleX = spritecont.scaleY = spritecont.y - stageh + ry;
                }
                if (displayobject2)
                {
                    displayobject2.parent.setChildIndex(displayobject2,displayobject2.parent.numChildren-1);
                }
                if (displayobject1)
                {
                    displayobject1.parent.setChildIndex(displayobject1,displayobject1.parent.numChildren-1);
                }
            }
        }
    }
}

 

posted on 2022-04-07 15:26  zqiang0803  阅读(51)  评论(0编辑  收藏  举报

导航