L'exemple qui m'a donné l'idée de réaliser ce carrousel était pour Flash 8. Donc en AS2 d'une part, et en utilisant pour les icônes des clips dans la bibliothèque de Flash. Moi, je voulais tout faire sous Flex, en chargeant les icônes dynamiquement. J'ai donc porté ce tutorial en AS3.

Voici les deux classes principales (j'aurais pu tout mettre dans une seule classe, mais ce sera plus clair comme cela).

Carousel.as :

package {
 
import flash.geom.Point;
import flash.events.Event;
import CarouselItem;
import mx.core.UIComponent;
import flash.events.MouseEvent;
 
 public class Carousel extends UIComponent
{
public var logos:Array; 
public var numOfObj:uint;
public var radius:Point;
public var center:Point;
public var speed:Number=0.02;
public var sortedItems:Array = new Array();
public var item:CarouselItem;
 
public function Carousel(w:Number,h:Number,logos:Array,fallof:Number){
 
this.logos = logos;
this.numOfObj = logos.length;
radius = new Point(w/2-padding,75);
center=new Point(w/2,h/2-radius.y);
 
for(var i:int=0;i<numOfObj;i++){
   item = new CarouselItem(logos[i]);
   item._falloff = fallof;
   item.angle=(i*((Math.PI*2)/numOfObj));
   item.addEventListener(Event.ENTER_FRAME,onEnter);
   sortedItems.push(item);
   addChild(item);
  }
}
 
 
public function arrange():void {
    sortedItems.sortOn("y", Array.NUMERIC);
    var i:int = sortedItems.length;
    while(i--){
        if (getChildAt(i) != sortedItems[i]) {
            setChildIndex(sortedItems[i], i);
        }
    }
}
 
public function onEnter(evt:Event):void{
	
var obj:CarouselItem=CarouselItem(evt.currentTarget);
 
obj.x=Math.cos(obj.angle) *radius.x +center.x - obj.width/2;
obj.y=Math.sin(obj.angle) *radius.y +center.y;
 
var scale:Number=obj.y /(center.y+radius.y);
obj.scaleX=obj.scaleY=scale*1;
obj.angle=(obj.angle+speed);
 
arrange();
}
 
public function onMove(evt:MouseEvent):void
{
	this.speed = (this.mouseX - center.x)/2300;
}
 
}
}

CarrouselItem.as :

package
{
import flash.display.*;
import flash.geom.Matrix;
import mx.core.UIComponent;
import flash.events.Event;
import flash.net.URLRequest;
import flash.geom.Point;
import flash.geom.Matrix;
import flash.geom.Rectangle;
 
public class CarouselItem extends UIComponent
{
private var _angle:Number;
private var pictLoad:Bitmap;
private var pictLdr:Loader;
private var ImageBitmap:BitmapData;
private var ReflectBitmap:BitmapData;
private var Image:Bitmap;
private var Reflect:Bitmap;
private var _alphaGradientBitmap: BitmapData;
private var _falloff: Number = 0.6;
private var HSize:Number;
private var WSize:Number;			
 
public function CarouselItem(logo:String){
pictLdr = new  Loader();
pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, onImgLoaded);
var pictURL:String = "assets/"+logo;
var pictURLReq:URLRequest = new URLRequest(pictURL);
pictLdr.load(pictURLReq);
}
 
public function onImgLoaded(event:Event):void {
pictLoad = Bitmap(pictLdr.content);
HSize = pictLoad.height;
WSize = pictLoad.width;
ReflectBitmap = new BitmapData(WSize, HSize, true, 0x00000000)
Image = new Bitmap(pictLoad.bitmapData);
ImageBitmap = Image.bitmapData;
addChild(Image);           
createReflect();
var rect: Rectangle = new Rectangle(0, 0,WSize , HSize);	
ReflectBitmap.fillRect(rect, 0xffffffff);
ReflectBitmap.copyPixels(ImageBitmap,rect, new Point(0,0),_alphaGradientBitmap);
Reflect = new Bitmap(ImageBitmap);
Reflect.bitmapData = ReflectBitmap;
addChild(Reflect);
var transform: Matrix = new Matrix();
transform.scale(1, -1);
transform.translate(0, HSize*2);
Reflect.transform.matrix = transform;					
}
 
private function createReflect(): void {
if (_alphaGradientBitmap == null) {
	_alphaGradientBitmap = new BitmapData(WSize, HSize, true, 0x00000000);
	var gradientMatrix: Matrix = new Matrix();
	var gradientSprite: Sprite = new Sprite();
	gradientMatrix.createGradientBox(WSize, HSize * _falloff, Math.PI/2, 
	0, HSize * (1.0 - _falloff));
	gradientSprite.graphics.beginGradientFill(GradientType.LINEAR, 
        [0x000000, 0x000000], [0, 1], [0, 255], gradientMatrix);
	gradientSprite.graphics.drawRect(0, HSize * (1.0 - _falloff), 
	WSize, (HSize*2) * _falloff);
	gradientSprite.graphics.endFill();
	_alphaGradientBitmap.draw(gradientSprite, new Matrix());	
		}	
	}
 
public function get angle():Number{
return _angle;
}
 
public function set angle(val:Number):void{
_angle=val;
}
 
}
}

Et enfin, pour l'utiliser :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
 width="470" height="470" creationComplete="init()"  backgroundColor="#000000">
<mx:Script>
<![CDATA[
			
public function init():void{
var logos:Array = [ "leaderprice.png", "peugeot-logo.png", "flex_logo.png",
		"leaderprice.png", "peugeot-logo.png", "gosport_logo_small.jpg",
		"flex_logo.png", "peugeot-logo.png", "gosport_logo_small.jpg" ]; 
var caroussel:Carousel = new Carousel(this.width,this.height,logos,0.6);
this.addChild(caroussel);
addEventListener(MouseEvent.MOUSE_MOVE,caroussel.onMove);
}
]]>
</mx:Script>	
</mx:Application>

Ce qui nous donne :

;

Deux petites choses : d'une part, j'ai choisi ici de ne pas embeder les images, pour ne pas alourdir le SWF. On aurait pu les embeder.

De plus, je n'ai pas implémenté le click sur un item. Je vous laisse le soin de le faire, ce n'est pas bien compliqué ( item.addEventListener(MouseEvent.click,lafonction) ) 8-) .

Voilà pour aujourd'hui...