Fleverlight 勉強会に参加してきた
Silverlight を囲む会 #3 と FxUG勉強会#46 で共同開催した、通称「Fleverlight勉強会」に行ってきた。
初の共催ということで、事前にも何回か打ち合わせするというすごい気合の入れよう。イベントを通して、お互いの技術のカラーやコミュニティのカラーが垣間見えて面白かった。
ただ、こういう共催のときは発表者は大変だ。片方にとっては当たり前のことでも、もう片方にとっては初耳のことばかりだったり。そういう点では、途中の、5分縛りの LT 4連発は、テンポもよくてメリハリがあって面白かった。こういう勉強会では小ネタ連発のほうが分かりやすいかもね。大ネタだと、一回置いてかれると残りの時間が辛いので。といっても、LT だけにする訳にもいかないので難しい。
そんなこんなで発表内容のメモを公開。
発表メモ
Silverlight 側の発表で目新しかった内容。
Deep Zoom
- Google Maps みたいな拡大できるやつを Silverlight で作る
- Silverlight 2 用のコンポーネント
- Deep Zoom composer というツールで作る
- 高精度の写真を貼り付けると、自動的に複数の解像度の画像ファイルを作る
- マウスでぐりぐりできるものが完成するデモ
- Virtual Earth の Silverlight Deep Zoom 版もある
Silverlight IDE
id:coma2n さん
- ブラウザ上で Silverlight 開発ができるツール
- 詳しくは Silverlight IDE - Architect Life にて
- コード補完はないの?という鬼質問が…!
WPF と Silverlight の XAML
- WPF, silverlight は XAML のスキーマは同じだけど、ランタイムの解釈が違う。
- WPF
- Windows で動く。
- Windows 専用の最適化。
- Silverlight
- ブラウザで動く。
- クラスプラットフォームなので制約が多い (3D、トリガー、Window がないとか)。
- β2 からは Silverlight 先行で機能が追加され始めてる (Visual State Manager)。そのうち、WPF にもマージされる予定。
ライブコーディングのソース
お題を言われてから30分で完成させないさい、という凶悪ライブコーディングだった。
どんなネタかと思ったら、「42 までの数字から1つをランダムに選んで表示するルーレットを作れ」というものだった。しかも、RIA っぽくリッチな UI にしろですって。ハードル高!
Flex User Group 側で参加したので、最初は MXML 使ってコーディングしてたけど、一段落したところで「AS3 だけのほうがいいや」と思って、AS3 だけで最初から作り直した。よく考えたら、Flex で layout="absolute" すればよかったんだ…。
で、完成品がコレ。
クリックすると数字が現れる。AS3 + Tweener で作ってる。
コーディングはいつもどおり、秀丸+rascut でやった。秀丸のコード補完機能に対する反響が多かったんだけど、秀丸v7.0 の目玉新機能。実際にはまったく使わなかったんだけど。
ソースは以下に。
最初作った MXML のソース。すごく投げやりな感じで setTimeout のところが汚い。
<?xml version="1.0"?> <!-- Simple example to demonstrate the Image control. --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="#ffffff" scaleX="4" scaleY="4"> <mx:Script> <![CDATA[ import mx.controls.*; import flash.utils.*; private function clickHandler():void{ var counter:int = 0; btn.enabled = false; var timerId:int = setTimeout(function():void{ counter++; var i:int = Math.floor(Math.random() * 41) + 1; show(i); if(counter > 10){ btn.enabled = true; }else{ setTimeout(arguments.callee, counter * 100); } }, 100); } private function show(i:int):void{ img1.source = "img/" + Math.floor(i / 10) + ".png"; img2.source = "img/" + (i % 10) + ".png"; } ]]> </mx:Script> <mx:HBox> <mx:Image id="img1" source="img/0.png"/> <mx:Image id="img2" source="img/0.png"/> </mx:HBox> <mx:Button id="btn" label="click!!" click="clickHandler()"/> </mx:Application>
最初から作り直した AS3 のソース。
package{ import flash.display.*; import caurina.transitions.Tweener; [SWF(backgroundColor="#ffffff")] public class Test2 extends Sprite{ [Embed(source='img/0.png')] private var Img0:Class; [Embed(source='img/1.png')] private var Img1:Class; [Embed(source='img/2.png')] private var Img2:Class; [Embed(source='img/3.png')] private var Img3:Class; [Embed(source='img/4.png')] private var Img4:Class; [Embed(source='img/5.png')] private var Img5:Class; [Embed(source='img/6.png')] private var Img6:Class; [Embed(source='img/7.png')] private var Img7:Class; [Embed(source='img/8.png')] private var Img8:Class; [Embed(source='img/9.png')] private var Img9:Class; public function Test2():void{ stage.scaleMode = "noScale"; stage.align = "TL"; scaleX = scaleY = 5; stage.addEventListener("click", function(event:*):void{ while(numChildren){ removeChildAt(0); } draw(); }); } private function draw():void{ var i:int = Math.floor(Math.random() * 42) + 1; var n1:int = Math.floor(i / 10); var n2:int = (i % 10); var cls:Array = [ Img0, Img1, Img2, Img3, Img4, Img5, Img6, Img7, Img8, Img9 ]; var img1:Bitmap = new cls[n1](); img1.rotation = 180; img1.x = 10; img1.y = -30; addChild(img1); var img2:Bitmap = new cls[n2](); img2.rotation = 180; img2.y = -30; img2.x = 40; addChild(img2); Tweener.addTween(img1, { rotation: 0, y: 50, time: 1, transition: "easeOutElastic" }); Tweener.addTween(img2, { rotation: 0, y: 50, time: 1, delay: .8, transition: "easeOutElastic" }); } } }
画像を埋め込むための Embed が無駄に多くて悲しいけど、クラス配列から new してるあたりがアクロバティックで気に入っている。