Home | Flex examples | TweenMax, псевдо 3D. Делаем карусель из картинок (мини фотоальбом). Трафик!

TweenMax, псевдо 3D. Делаем карусель из картинок (мини фотоальбом). Трафик!

Font size: Decrease font Enlarge font
image

Делаем карусель из картинок на Flex 3 используя TweenMax. ActionScript Project mini photoalbum.

Сделаем мини фотоальбом в виде карусели, с центральной картинкой посередине. Она у нас будет текущей и естественно самой большой. Далее от нее в пространство будут уходить остальные картинки, пропорционально уменьшенные. Располагать их будем по две и их количество будет нечетное, поскольку центральная картинка одна (это уже разные варианты задачи).

Создадим Flex ActionScript Project, главный файл назовем index, он у нас будет расширением Sprite.
Поскольку для движения будем использовать TweenMax, сначала необходимо скачать этот пакет и установить в папке нашего приложения - see TweenMax.
Установим начальные параметры swf:

...[SWF(backgroundColor = 0xFFFFFF, frameRate='30', width='466', height='320')]...

цвет, количество кадров в секунду, ширину и высоту. Ширина рассчитывается как сумма ширины центральной картинки и всех уменьшенных, разделенных на некоторую константу, высота соответственно. Также создадим Sprite, который будет содержать все картинки, его размеры будут соответствовать размерам приложения.

...
            mainSprite.graphics.beginFill(0XFFFFFF);
            mainSprite.graphics.lineStyle(2)
            mainSprite.graphics.drawRect(0, 0, stageWidth, stageHeight);
            mainSprite.graphics.endFill();
            addChild(mainSprite);
...

Рассчитывая размеры приложения создадим объекты, в которых будут содержаться данные о загружаемых картинках и запишем их в массив.
...
                var imObject:Object = new Object();
                imObject.imWidth = iWidth;
                imObject.imHeight = iHeight;
                imObject.posX = 0;
                imObject.posY = 5;
                imObject.scaleX = scaleArray[i] //массив, содержащий уменьшение по X
                imObject.scaleY = scaleArray[i]//массив, содержащий уменьшение по Y
                imObject.url = imArray[i];
                imObject.displayImage = null;
                imObject.index = i;
                imCollection.push(imObject);
...


Далее инвертируем массив с объектами картинок и добавим их в главный спрайт - mainSprite. Для загрузки картинок будем использовать класс ImageLoader, его код можно найти в source.

На каждый добавляемый объект повесим событие на клик мышкой. Функция, обрабатывающая это событие будет определять в какую сторону поворачивать карусель и надо ли это делать (не надо если нажали на центральную картину). Будем крутить влево, при нечетном индексе нажатой картинки, и направо - четном.
Часть кода для вращения вправо:
...
            if(currentIndex != imCollection.length-1)
            {
                if(currentIndex%2 == 0)
                {
                    //крутим по часовой стрелке
                    //рассчитываем количество нужных прокрутов (на один больше, так как сначала будет запущена функция поворота, которая уменьшит индекс)
                    if(currentIndex < (imCollection.length-4) )
                        intervalCount = ((imCollection.length-1)/2) - (currentIndex/2);
                                   
                    if(currentIndex == 0)
                        intervalCount = ((imCollection.length-1)/2);
                                       
                    rightTurn();
                    if(intervalCount > 0 && goTurn == false)
                    {
                        goTurn = true;
                        intervalIndex = flash.utils.setInterval(rightTurn, 300)
                    }
                }
...

Функция для поворота вправо. Для перемещения объектов используем TweenMax, вообще тут можно много пофантазировать и получить интересные результаты разного движения картинок.
...
            //поворот направо
            var tempItemsIndexes:Array = new Array;
            var tempItems:Array = new Array;
            var originalArray:Array = new Array;
           
            for(var i:int=0;i
            {
                originalArray.push(imCollection[i]);
                if(i%2 == 0)
                {
                    if(i != (imCollection.length-1) )
                    {
                        tempItemsIndexes.push( i+2 );
                    }else
                    {
                        tempItemsIndexes.push( i-1 );
                    }
                }
               
                if(i%2 == 1)
                {
                    if( i != 1)
                    {
                        tempItemsIndexes.push( i-2 );
                    }else
                    {
                        tempItemsIndexes.push( i-1 );
                    }
                }
               
                tempItems.push(imCollection[tempItemsIndexes[i]]);
                //движение при помощи TweenMax
                gs.TweenMax.allTo([imCollection[i].displayImage], 1, {x:tempItems[i].posX, y:tempItems[i].posY, scaleX:scaleArray[tempItemsIndexes[i]], scaleY:scaleArray[tempItemsIndexes[i]]});
                //gs.TweenMax.allTo([imCollection[i].displayImage], 1, {x:tempItems[i].posX, y:tempItems[i].posY, scaleX:scaleArray[tempItemsIndexes[i]], scaleY:scaleArray[tempItemsIndexes[i]], bezier:[{x:150, y:170}]});

            }
           
            //удаляем все наши спрайты, чтобы потом выстроить их в нужном порядке
             for(i=0;i
            {
                mainSprite.removeChildAt(0);
            }
           
            originalArray.reverse();
            tempItemsIndexes.reverse();
            var newImagesArray:Array = new Array
            //определяем новый порядок спрайтов
            for(i=0;i
            {
                newImagesArray.push(originalArray[tempItemsIndexes[i]])
            }
           
            imCollection = newImagesArray;
            for(i=0;i
            {
                mainSprite.addChild(newImagesArray[i].displayImage);
                //координаты устанавливаем начальные, новым картинкам
                imCollection[i].posX = posXArray[i];
                imCollection[i].posY = posYArray[i];
            }   
           
            //уменьшаем счетчик вращений
            intervalCount--;
            if(intervalCount <= 0)
            {   //прекращаем крутить
                flash.utils.clearInterval(intervalIndex)
                goTurn = false;
            }
...


В итоге получим небольшой фотоальбом. 

Исходники - source, приложение - application

 

Comments ( posted):

Post your comment comment

Please enter the code you see in the image:

  • email Email to a friend
  • print Print version
  • Plain text Plain text
Tags
No tags for this article
Rate this article
0