アニメーション

JavaFXはRIAプラットフォームなだけあり、アニメーションに関する機能も充実している。ただし、アニメーションに関してはタイムライン、キーフレームなど、通常のGUIアプリケーションとは異なる概念を理解する必要がある(Flashユーザにはお馴染みの概念だ)。

例としてJavaFXのサンプルに含まれているClockアプリケーションのソースコードを見てみよう。

Clockアプリケーション

ClockアプリケーションではClockWorkというクラスを定義している。このクラスはJavaFXのCustomNodeクラスを継承しており、時計の描画とアニメーション処理をカプセル化したものだ。

class ClockWork extends CustomNode {

    var seconds : Number;
    var minutes : Number;
    var hours : Number;

    init {
        var calendar : Calendar = Calendar.getInstance();
        seconds = calendar.get( Calendar.SECOND );
        minutes = calendar.get( Calendar.MINUTE );
        hours = calendar.get( Calendar.HOUR_OF_DAY );
    }

    public var timer : Timeline = Timeline { // ... (1)
        repeatCount : Timeline.INDEFINITE
        keyFrames :
            KeyFrame {
                time : 1s
                action : function() {
                    var calendar : Calendar = Calendar.getInstance();
                    seconds = calendar.get( Calendar.SECOND );
                    minutes = calendar.get( Calendar.MINUTE );
                    hours = calendar.get( Calendar.HOUR_OF_DAY );
                }
            },
    };

    public override function create(): Node { // ... (2)
        return Group {
            content : [
                Circle {
                    transforms : [ Translate { y : 100 }]
                    centerX : 100
                    radius : 80
                    fill : Color.GRAY
                },
                Line {
                    transforms : [ Rotate { angle : bind seconds * 6, pivotX : 100, pivotY : 100 }]
                    startX : 100
                    startY : 30
                    endX : 100
                    endY : 100
                    stroke : Color.WHITE
                },
                Line {
                    transforms : [ Rotate { angle : bind minutes * 6, pivotX : 100, pivotY : 100 }]
                    startX : 100
                    startY : 40
                    endX : 100
                    endY : 100
                    stroke : Color.WHITE
                    strokeWidth : 2
                },
                Line {
                    transforms : [ Rotate { angle : bind hours * 30, pivotX : 100, pivotY : 100 }]
                    startX : 100
                    startY : 50
                    endX : 100
                    endY : 100
                    stroke : Color.WHITE
                    strokeWidth : 4
                }
                ]
        };
    }
}

(1)で時計の針を動かすためのタイムラインを生成している。タイムラインは1秒ごとに実行されるキーフレームを含んでおり、キーフレームのアクションで時分秒を示すプロパティを更新している。

また、(2)ではcreate()メソッドをオーバーライドし、時計を描画するためのシェイプを生成している。時計の針はLineシェイプを用いて描画されており、Rotateのangleプロパティが時分秒を示すプロパティにバインドされている。これによってキーフレームが時分秒を更新するとRotateのangleプロパティに値が反映され、時計の針が回転するというわけだ。

最終的にClockWorksクラスを以下のように配置し、timerプロパティのplay()メソッドを呼び出すことでタイムラインの再生が開始し、Clockアプリケーションが動作する。

var clockWork : ClockWork = ClockWork {};

Stage {
    scene : Scene {
        content : clockWork
        }

    width : 200
    height : 232
    title: "Clock"
}

clockWork.timer.play();

JavaFXのAPIを駆使することで複雑なアニメーションも実現することができる。とはいうものの、オーサリングツールなしで複雑なアニメーションを作成するのは非常に手間のかかる作業だ。今後はツールの充実も期待したいところだ。

課題もメリットも多い新技術

RIAプラットフォームはMicrosoftのSilverlightやAdobeのAIRなど、有力な競合プラットフォームがひしめいており、JavaFXがメインストリームとなるかどうかは不透明な状況だ。JavaFXはJavaプラットフォームを基盤としてはいるものの、新しくJavaFX Scriptを習得しなくてはならない、開発ツールがまだまだ充実しているとは言い難いなど、他の競合技術と比較すると不利な点もある。

とはいえJavaFXでは既存の豊富なJava資産が活用できる、JavaVM上で動作することによる信頼性などJavaプラットフォームならではのメリットも多い。また、NetBeansのJavaFXプラグインはまだまだ機能面で改善の余地があるものの、開発ツールがオープンソースで提供されており、無償で開発環境を手に入れることができるという点はデベロッパにとっては大きなメリットと言えるのではないだろうか。

JavaFXはまだ1.0がリリースされたばかり。今後の動向にも要注目だ。