では、dojo.animatePropertyと3章で紹介したアニメーションイベントを利用し、実際に役に立ちそうなサンプルアプリケーションを作成してみましょう。ここでは、選挙の投票結果を表示するアプリケーションを作ってみます。今回はテーブルとして、候補者名、得票数、得票数のグラフを表示し、それぞれに対して以下のようなアニメーションを実装してみます。
| アニメーション | 説明 |
| 候補者名 | 最初の500msは何も表示されず、残りの1500msで徐々にフェードインし、最終的には、当選者の名前を赤字Boldで“候補者名(win!)“と表示する。 |
| 得票数 | +,*,-を繰り返し表示し得票数がアニメーション中はわからないようにし、最終的には、得票数が表示されるようにする |
| 得票数グラフ | バーチャートが徐々に伸びてゆく |
コードは以下のようになります。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html401/strict.dtd">
<html>
<head>
<title>Animation Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
@import "../dojo-release-1.5.0/dojo/resources/dojo.css";
@import "../dojo-release-1.5.0/dijit/themes/claro/claro.css";
table {
width: 400px;
border: 1px #E3E3E3 solid;
border-collapse: collapse;
border-spacing: 0;
table-layout: fixed;
}
th {
padding: 5px;
border: #E3E3E3 solid;
border-width: 0 0 1px 1px;
background: #F5F5F5;
font-weight: bold;
line-height: 120%;
text-align: center;
}
td {
padding: 5px;
border: 1px #E3E3E3 solid;
border-width: 0 0 1px 1px;
padding-left: 5px;
text-align: left;
}
.chart {
border: none;
background-color: blue;
height: 10px;
}
</style>
<script type="text/javascript" src="../dojo-release-1.5.0/dojo/dojo.js" djConfig="parseOnLoad: true">
</script>
<script type="text/javascript">
dojo.require("dojo.fx");
dojo.addOnLoad(function() {
//候補者と得票数のデータを定義。得票数でソート済みとする
var json = [
{name:"太郎", value:57},
{name:"次郎", value:33},
{name:"三郎", value:20},
{name:"四郎", value:8}
];
//バーチャートと得票数のアニメーションを定義
function animateBarChart(target, score, max) {
var scoreNode = target.parentNode.previousSibling;
var barWidth = 100 * score / max;
return dojo.animateProperty({
node:target,
duration: 1500,
properties: {
width: { start:1, end:barWidth }
},
onAnimate: function(values) {
if (scoreNode.innerHTML == "+") {
scoreNode.innerHTML = "*";
} else if (scoreNode.innerHTML == "*") {
scoreNode.innerHTML = "-";
} else {
scoreNode.innerHTML = "+";
}
},
onEnd: function(node) {
scoreNode.innerHTML = score + "票";
}
});
}
//候補者名
function animateCandidateName(target, name, winner) {
return dojo.animateProperty({
node:target,
delay: 500,
duration: 1000,
properties: {
opacity: { start:0, end:1 }
},
onBegin: function(values) {
target.innerHTML = name;
},
onEnd: function(node) {
if (winner) {
dojo.style(node, "color", "red");
dojo.style(node, "fontWeight", "bold");
node.innerHTML += "(WIN!)";
}
}
});
}
//jsonからテーブルの行を生成。
var tbody = dojo.byId("result");
var animations = [];
for (var i=0; i<json.length; i++) {
var tr = dojo.create("tr", {}, tbody);
var name = dojo.create("td", {}, tr);
var score = dojo.create("td", {}, tr);
var chart = dojo.create("div", {className:"chart"}, dojo.create("td", {}, tr));
var animation = dojo.fx.combine([
animateBarChart(chart, json[i].value, json[0].value),
animateCandidateName(name, json[i].name, i==0)
]);
animations.push(animation);
}
dojo.fx.combine(animations).play();
});
</script>
</head>
<body class="claro">
<h1>投票結果</h1>
<table>
<thead>
<tr><th>候補者</th><th colspan="2">投票数</th></tr>
</thead>
<tbody id="result">
</tbody>
</table>
</body>
</html>
dojo.addOnLoadの中身に注目してください。まず、jsonとして候補者名とその得票数の一覧を定義しまいます。addOnLoadの後半で、このjsonからテーブルの行を動的に生成しています。
animateBarChart関数では、dojo.animatePropertyを利用して、バーチャートのwidthを1から得票数を表す長さ(100 * score / max)まで変化させるアニメーションを定義しています。また同時に、onAnimate関数で得票数を+,*,-を連続で表示させるようにし、onEnd関数で、最終的に得票数を表示するようにしています。
同様に、animateCandidateName関数では、dojo.animatePropertyを利用して、opacityの値を0から1へ変化させることで、候補者名をフェードインさせています。ここではonBeginで初めて候補者名をinnerHTMLにセットすることで、delayでしていした最初の500msは何も表示されないようにしています。そして、onEndで、当選者の場合にスタイルを変化させ“(WIN!)“という文字列を追加するようにしています。
各行ごとに、animateBarChartとanimateCandidateNameで作成したアニメーションをdojo.fx.combineし、各行のアニメーションをさらにdojo.fx.combineすることで、得票結果のテーブル全体を同時にアニメーションさせています。

Dojox.fx
これまでは、dojoパッケージに含まれるアニメーションを紹介して来ましたが、最後に、dojox.fxパッケージに含まれるものも少し紹介しておきます。dojox.fxには、役立つアニメーションの実験的な実装が多数用意されています。例えば、dojox.fx.sizeTo(オブジェクトのwidthとheightを変化させる)や、dojox.fx.highlight(オブジェクトを点滅させる)など、他にもアニメーション生成関数が多数用意されています。また、アニメーションを利用した面白いウィジェットも多数用意されています。以下のページに機能紹介があるので、参考にされると良いと思います。
まとめ
この記事では、デフォルトのアニメーションの使い方、その組み合わせ方、アニメーションイベント、そして独自のアニメーションを定義する方法を解説しました。これらの機能は既存のDojoフレームワーク中でも既に使われているため、安心して利用することができます。例えば、ダイアログはツールチップの表示・非表示ではフェードイン、フェードアウトが使われています。また、トースター(画面右端にメール着信をみせるために出る小さなWindowとしてよく利用されるもの)では、dojo.fx.slideToが利用されています。

このように、ちょっとしたアニメーション効果を追加することで、Webアプリケーションを、まるでネイティブのリッチアプリケーションのような機能を持たせることもできるので、ぜひ色々活用してみてください。
