TweenJSでアニメーションしてみる2(EaselJSも使ってみる)
こんにちは。受託開発担当のMasaです。
前回 TweenJSの記事の続きで、今回はテキストのアニメーションを紹介します。
前回の予告では TweenJS を拡張した JSTween プロジェクトの TextTween を紹介すると書きましたが、コンストラクタを呼び出すだけで終わってしまうため、EaselJS + TweenJS でのテキストアニメーションを紹介することにしました。
有名なフレームワークなので説明は省略します。尚、現在の最新バージョンは v7.0 なのでこれを使用します。
とりあえず何かテキストを表示します。
canvas は必ず必要です。Stage は最上位のコンテナで、update することで子オブジェクトを描画します。
<!DOCTYPE html> <head> <script src='easeljs-0.7.0.min.js'></script> <script> window.onload = function() { // canvas を指定してステージを作成 var stage = new createjs.Stage("c"); // 第1引数:描画する文字 // 第2引数:フォントスタイル // 第3引数:フォントカラー var text = new createjs.Text("CoReports","Bold 50px Tahoma", "#666666"); stage.addChild(text); stage.update(); }; </script> </head> <body> <canvas id="c"> 未対応 </canvas> </body>
1文字ずつアニメーションさせたいので、それぞれ別のテキストオブジェクトにします。
複数のテキストオブジェクトをまとめて扱いたいので Container を使用します。
<script> window.onload = function() { // canvas を指定してステージを作成 var stage = new createjs.Stage("c"); // オブジェクトをまとめて扱うために Container を使用 var container = new createjs.Container(); stage.addChild(container); // 1文字ずつオブジェクト化 var w = 'CoReports'; for (var i = 0, width = 0; i < 9; i++) { var s = w.substring(i, i + 1); var text = new createjs.Text(s,"Bold 50px Tahoma", "#666666"); // 直前の文字の横に描画 text.x = width; container.addChild(text); width += text.getMeasuredWidth(); } stage.update(); }; </script>
アニメーションなので、指定した間隔で再描画するために Ticker を使用します。
Ticker.addEventListener に Stage を渡すと、Tick イベントで Stage.update が実行されます。
今回は Stage.update をしたいだけなので今回はこれで十分です。
// 1秒間に50回描画する(tick イベントが起きる) createjs.Ticker.setFPS(50); // Stage を渡すと Stage.update が呼ばれる createjs.Ticker.addEventListener("tick", stage); // 不要 //stage.update();
Text には scaleX, scaleY が指定できるので、これをトゥイーンさせます。
tweenjs-0.5.0.min.js を使用します。
<script src='tweenjs-0.5.0.min.js'></script>
テキストの初期 scale を 0 に設定し、1 秒後に 1 になるように実装します。
// 1文字ずつオブジェクト化 var w = 'CoReports'; for (var i = 0, width = 0; i < 9; i++) { var s = w.substring(i, i + 1); var text = new createjs.Text(s,"Bold 50px Tahoma", "#666666"); // サイズ0 text.scaleX = 0; text.scaleY = 0; // 直前の文字の横に描画 text.x = width; container.addChild(text); width += text.getMeasuredWidth(); } for (var i = 0; i < 9; i++) { // テキストの scaleX と scaleY を 0 → 1 へ new createjs.Tween(container.getChildAt(i)) .to({scaleX:1,scaleY:1}, 1000, createjs.Ease.circOut); }
テキストがだんだん前面に出てくるような感じになりました。
以上で終わりです。
コード全体はコチラ。
<!DOCTYPE html> <head> <style> body { margin: 0px; padding: 0px; } #c { background-color: Aliceblue; width: 600px; height: 200px; } </style> <script src='easeljs-0.7.0.min.js'></script> <script src='tweenjs-0.5.0.min.js'></script> <script> window.onload = function() { // canvas を指定してステージを作成 var stage = new createjs.Stage("c"); // 1文字1オブジェクトにしてまとめて扱うために Container を使用 var container = new createjs.Container(); stage.addChild(container); // 1秒間に50回描画する(tick イベントが起きる) createjs.Ticker.setFPS(50); // Stage を渡すと Stage.update が呼ばれる createjs.Ticker.addEventListener("tick", stage); // 1文字ずつオブジェクト化 var w = 'CoReports'; for (var i = 0, width = 0; i < 9; i++) { var s = w.substring(i, i + 1); var text = new createjs.Text(s,"Bold 50px Tahoma", "#666666"); // サイズ0 text.scaleX = 0; text.scaleY = 0; // 直前の文字の横に描画 text.x = width; container.addChild(text); width += text.getMeasuredWidth(); } for (var i = 0; i < 9; i++) { // テキストの scaleX と scaleY を 0 → 1 へ new createjs.Tween(container.getChildAt(i)) .to({scaleX:1,scaleY:1}, 1000, createjs.Ease.circOut); } }; </script> </head> <body> <canvas id="c"> 未対応 </canvas> </body> </html>