2007-09-05 | 21:16
入力フィールドに検索タグを入力して、虫眼鏡のアイコンをクリックしてください。
Flickrより画像を取得します。
画像が表示されたら左右の矢印アイコンで画像がカルーセル移動します。
Flickrより画像を取得します。
画像が表示されたら左右の矢印アイコンで画像がカルーセル移動します。
Carousel.as
package { import flash.display.*; import flash.filters.*; import flash.events.*; import flash.net.*; import flash.text.*; import flash.utils.*; import flash.system.Security; import com.adobe.webapis.flickr.FlickrService; import com.adobe.webapis.flickr.events.FlickrResultEvent; import com.adobe.webapis.flickr.Photo; [SWF(width="600", height="250", backgroundColor="#ffffff")] public class Carousel extends Sprite{ private var fl:FlickrService; private var bitmaps:Array = new Array(); private var animeIndex:int = 0; private var topIndex:int = 0; private var tf:TextField; //private var debug:TextField; private var mode:int; private static var animeFrame:int = 10; [Embed(source="right.png")] private var buttonRight:Class; [Embed(source="left.png")] private var buttonLeft:Class; [Embed(source="glass.gif")] private var buttonGlass:Class; private var rad:Number = 0; public function Carousel():void { Security.loadPolicyFile("http://farm2.static.flickr.com/crossdomain.xml"); tf = new TextField(); tf.border=true; tf.height=20; tf.text = "apple"; tf.type = TextFieldType.INPUT; tf.x = 210; tf.y = 10; addChild(tf); //debug = new TextField(); //debug.x = 300; //addChild(debug); createButton(320,10,"search", new buttonGlass()); createButton(50,200,"left", new buttonLeft()); createButton(400,200,"right", new buttonRight()); } private function createButton(x:int, y:int, name:String, b:DisplayObject):void{ b.filters = [new DropShadowFilter()]; var button:SimpleButton = new SimpleButton(); button.x = x; button.y = y; button.name = name; button.upState = b; button.overState = button.upState; button.hitTestState = button.upState; addChild(button); button.addEventListener(MouseEvent.MOUSE_DOWN, onMouseClick); } private function onMouseClick(e:MouseEvent):void{ var button:SimpleButton = SimpleButton(e.target); if(button.name == "search"){ //debug.text = "search"; for each(var bm:ThreeDBitmap in bitmaps) removeChild(bm.parent); bitmaps = new Array(); topIndex = 0; var apikey:String =ThreeDBitmap.as; fl = new FlickrService(apikey); fl.photos.search("","","any",tf.text); // 検索が終わったら onSearch()を呼び出す fl.addEventListener(FlickrResultEvent.PHOTOS_SEARCH, onSearch); }else if(button.name == "right"){ mode = 1; startAnimation(); }else if(button.name == "left"){ mode = -1; startAnimation(); } } private function startAnimation():void{ var animeTimer:Timer = new Timer(50); animeIndex = 0; animeTimer.addEventListener(TimerEvent.TIMER, onAnimeTimer); animeTimer.start(); } private function onSearch(event:FlickrResultEvent):void{ //debug.text = event.data.photos.photos.length; fl.removeEventListener(FlickrResultEvent.PHOTOS_SEARCH,onSearch); var count:int = 0; // 検索結果を走査 for each (var photo:Photo in event.data.photos.photos) { // 写真URLを構築 var url:String = "http://static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_s.jpg"; // URLをリクエスト var req:URLRequest = new URLRequest(url); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onBitmapLoad); loader.load(req); if(++count > 10) break; } } private function onBitmapLoad( e:Event ):void { var loader:Loader = LoaderInfo(e.target).loader; var bitmap:Bitmap = Bitmap(loader.content); var s:Sprite = new Sprite(); addChild(s); var bm:ThreeDBitmap = new ThreeDBitmap(bitmap, s); bm.x = -100; bm.y = -100; bitmaps.push(bm); startAnimation(); } private function onAnimeTimer(e:TimerEvent):void{ rad += Math.PI/5/animeFrame*mode; var index:int = 0; for each(var bm:ThreeDBitmap in bitmaps){ var thisRad:Number = Math.PI/5 * index + rad; thisRad %= Math.PI*2; if(thisRad > Math.PI/2 && thisRad < Math.PI*3/2){ bm.x = 300 + 200*Math.sin(thisRad); setChildIndex(bm.parent,0); bm.alpha = 0; } else{ bm.x = 300 + 200*Math.sin(thisRad); setChildIndex(bm.parent,bitmaps.length-1); bm.alpha = 1; } bm.rotation = thisRad; bm.y = 100; index++; } if(++animeIndex > animeFrame){ Timer(e.target).removeEventListener(TimerEvent.TIMER, onAnimeTimer); } } } }
package{ import flash.display.*; import flash.geom.*; import flash.system.Security; public class ThreeDBitmap{ private var bitmapSlices:Array = new Array(); private var _x:int=0; private var _y:int=0; private var _rotation:Number=0; private var _parent:Sprite; public function ThreeDBitmap(bm:Bitmap, parent:Sprite){ for(var i:int =0; i < bm.width; i++){ var slicedBitmapData:BitmapData = new BitmapData(1,bm.height,true,0x00000000); var rect:Rectangle = new Rectangle(i,0,1,bm.height); slicedBitmapData.copyPixels(bm.bitmapData,rect,new Point(0,0)); var slicedBitmap:Bitmap = new Bitmap(slicedBitmapData); bitmapSlices.push(slicedBitmap); parent.addChild(slicedBitmap); _parent = parent; slicedBitmap.x = i; slicedBitmap.y = 0; } } public function set x(v:int):void{ _x = v; redraw(); } public function set y(v:int):void{ _y = v; redraw(); } public function set rotation(v:Number):void{ _rotation = v; redraw(); } public function set alpha(v:Number):void{ for each(var bm:Bitmap in bitmapSlices){ bm.alpha = v; } } public function redraw():void{ var i:int = 0; for each(var bm:Bitmap in bitmapSlices){ bm.x = _x + i*Math.cos(_rotation); if(i > bitmapSlices.length*2/5 && i < bitmapSlices.length*3/5) bm.scaleX = 1.01; var j:Number = i - bitmapSlices.length / 2; var t:Number = (j*j/2)*(1/(2*j) - 1/(2*j+(j/2)*Math.sin(_rotation))); bm.y = _y + t; bm.scaleY = (bm.height - 2*t) / bm.height; i++; } } public function get width():int{ return bitmapSlices.length; } public function get parent():Sprite{ return _parent; } public function get x():int{ return _x; } } }
スポンサーサイト
Comment
Post a comment