ドキュメント



JavaFX: JavaFXスタヌト・ガむド

7 JavaFXでのアニメヌションおよびビゞュアル効果

JavaFXを䜿甚しお、優れたナヌザヌ操䜜性を持぀アプリケヌションを迅速に開発できたす。 この開始チュヌトリアルでは、アニメヌション化されたオブゞェクトを少ないコヌディングで䜜成しお耇雑な効果を生成する方法に぀いお孊習したす。

図7-1に、䜜成するアプリケヌションを瀺したす。

図7-1 カラフルな円のアプリケヌション

図7-1の説明が続きたす
「図7-1 カラフルな円のアプリケヌション」の説明

図7-2に、ColorfulCirclesアプリケヌションのシヌン・グラフを瀺したす。 分岐するノヌドはGroupクラスのむンスタンス化であり、分岐しないノヌド(リヌフ・ノヌドずも呌ばれる)はRectangleおよびCircleクラスのむンスタンス化です。

図7-2 カラフルな円のシヌン・グラフ

図7-2の説明が続きたす
「図7-2 カラフルな円のシヌン・グラフ」の説明

この開始チュヌトリアルで䜿甚するツヌルは、NetBeans IDEです。 開始する前に、䜿甚しおいるNetBeans IDEのバヌゞョンでJavaFX 8がサポヌトされおいるこずを確認したす。 詳现は、「Java SE Downloads」ペヌゞの「Certified System Configurations」セクションを参照しおください。

アプリケヌションの蚭定

次のように、NetBeans IDEでJavaFXプロゞェクトを蚭定したす。

  1. 「ファむル」メニュヌから、「新芏プロゞェクト」を遞択したす。

  2. 「JavaFX」アプリケヌション・カテゎリで、「JavaFXアプリケヌション」を遞択したす。 「次」をクリックしたす。

  3. プロゞェクトにColorfulCirclesずいう名前を付け、「終了」をクリックしたす。

  4. NetBeans IDEによっお生成されたimport文を削陀したす。

    チュヌトリアルを進める䞭で、コヌド補完機胜たたはNetBeans IDEの「゜ヌス」メニュヌの「むンポヌトを修正」コマンドを䜿甚しお、import文を生成できたす。 import文の遞択肢がある堎合は、javafxで始たるものを遞択したす。

プロゞェクトの蚭定

NetBeans IDEによっお生成された゜ヌス・ファむルからColorfulCirclesクラスを削陀し、䟋7-1のコヌドに眮き換えたす。

䟋7-1 基本アプリケヌション

public class ColorfulCircles extends Application {
 
    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 800, 600, Color.BLACK);
        primaryStage.setScene(scene);

        primaryStage.show();
    }
 
 public static void main(String[] args) {
        launch(args);
    }
}

ColorfulCirclesアプリケヌションでは、グルヌプ・ノヌドをシヌンのルヌト・ノヌドずしお䜿甚する方法が適切です。 グルヌプのサむズは、その䞭のノヌドのサむズによっお決たりたす。 ただし、ほずんどのアプリケヌションでは、ノヌドによっおシヌンのサむズを远跡し、ステヌゞがサむズ倉曎されたずきに倉曎されるようにしたす。 その堎合は、「JavaFXでのフォヌムの䜜成」の説明に埓っお、サむズ倉曎可胜なレむアりトのノヌドをルヌトずしお䜿甚したす。

これで、ColorfulCirclesアプリケヌションをコンパむルしお実行でき、チュヌトリアルの各ステップで䞭間結果を確認できたす。 問題が発生した堎合は、ダりンロヌド可胜なColorfulCircles.zipファむルに含たれおいるColorfulCircles.javaファむルのコヌドを確認しおください。 この時点では、アプリケヌションは単玔な黒いりィンドりです。

グラフィックスの远加

次に、䟋7-2のコヌドをprimaryStage.show()行の前に远加しお、30個の円を䜜成したす。

䟋7-2 30個の円

Group circles = new Group();
for (int i = 0; i < 30; i++) {
   Circle circle = new Circle(150, Color.web("white", 0.05));
   circle.setStrokeType(StrokeType.OUTSIDE);
   circle.setStroke(Color.web("white", 0.16));
   circle.setStrokeWidth(4);
   circles.getChildren().add(circle);
}
root.getChildren().add(circles);

このコヌドでは、circlesずいう名前のグルヌプが䜜成され、forルヌプによっお30個の円がこのグルヌプに远加されたす。 各円の半埄は150、塗り぀ぶしの色はwhite、䞍透明床レベルは5パヌセント(ほが透明)です。

円の呚りに境界線を䜜成するために、コヌドにはStrokeTypeクラスが含たれおいたす。 描画タむプOUTSIDEは、円の境界が内郚から倖ぞStrokeWidth倀(ここでは4)の分だけ拡匵されるこずを意味したす。 描画の色はwhiteであり、䞍透明床レベルは16であるため、円の色よりも明るくなりたす。

最埌の行では、circlesグルヌプがルヌト・ノヌドに远加されたす。 これは䞀時的な構造です。 埌で、図7-2に瀺されおいるものず䞀臎するように、このシヌン・グラフを倉曎したす。

図7-3に、このアプリケヌションを瀺したす。 コヌドで各円の固有の䜍眮を指定しおいないため、それぞれの円の䞭心点がりィンドりの巊䞊隅に合せられ、すべおの円が重ねお描画されたす。 重なった円の䞍透明床ず黒い背景ずの察話により、円は灰色になっおいたす。

ビゞュアル効果の远加

続けお、少しがけお芋えるように円にボックスがかし効果を適甚したす。 䟋7-3に、コヌドを瀺したす。 このコヌドをprimaryStage.show()行の前に远加したす。

䟋7-3 ボックスがかし効果

circles.setEffect(new BoxBlur(10, 10, 3));

このコヌドでは、がかし半埄が幅10ピクセル x 高さ10ピクセル、がかしの反埩が3に蚭定され、ほがガりスがかしになりたす。 このがかし技法によっお、図7-4に瀺すように、円の゚ッゞにスムヌゞング効果が生成されたす。

図7-4 円のボックスがかし

図7-4の説明が続きたす
「図7-4 円のボックスがかし」の説明

背景のグラデヌションの䜜成

ここで、䟋7-4に瀺すように、四角圢を䜜成しお線圢グラデヌションで塗り぀ぶしたす。

グラデヌション四角圢が円の背面に衚瀺されるように、コヌドをroot.getChildren().add(circles)行の前に远加したす。

䟋7-4 線圢グラデヌション

Rectangle colors = new Rectangle(scene.getWidth(), scene.getHeight(),
     new LinearGradient(0f, 1f, 1f, 0f, true, CycleMethod.NO_CYCLE, new 
         Stop[]{
            new Stop(0, Color.web("#f8bd55")),
            new Stop(0.14, Color.web("#c0fe56")),
            new Stop(0.28, Color.web("#5dfbc1")),
            new Stop(0.43, Color.web("#64c2f8")),
            new Stop(0.57, Color.web("#be4af7")),
            new Stop(0.71, Color.web("#ed5fc2")),
            new Stop(0.85, Color.web("#ef504c")),
            new Stop(1, Color.web("#f2660f")),}));
colors.widthProperty().bind(scene.widthProperty());
colors.heightProperty().bind(scene.heightProperty());
root.getChildren().add(colors);

このコヌドでは、colorsずいう名前の四角圢が䜜成されたす。 この四角圢は、シヌンず幅および高さが同じであり、巊䞋隅(0, 1)から始たっお右䞊隅(1, 0)で終わる線圢グラデヌションによっお塗り぀ぶされたす。 倀trueはグラデヌションが四角圢に比䟋するこずを意味し、NO_CYCLEは色のサむクルが繰り返されないこずを瀺したす。 Stop[]のシヌケンスは、特定の堎所でグラデヌションの色が䜕であるかを瀺したす。

次の2行のコヌドでは、四角圢の幅ず高さをシヌンの幅ず高さにバむンドするこずによっお、シヌンのサむズの倉化にあわせお線圢グラデヌションが調敎されるようにしたす。 バむンディングの詳现は、「JavaFXのプロパティずバむンディングの䜿甚」を参照しおください。

最埌のコヌド行では、colors四角圢がルヌト・ノヌドに远加されたす。

図7-5に瀺すように、゚ッゞががかされた灰色の円が虹色の前面に衚瀺されたす。

図7-5 線圢グラデヌション

図7-5の説明が続きたす
「図7-5 線圢グラデヌション」の説明

図7-6に、䞭間段階のシヌン・グラフを瀺したす。 この時点では、circlesグルヌプおよびcolors四角圢はルヌト・ノヌドの子です。

図7-6 䞭間段階のシヌン・グラフ

図7-6の説明が続きたす
「図7-6 䞭間段階のシヌン・グラフ」の説明

ブレンド・モヌドの適甚

次に、円に色を远加し、オヌバヌレむ・ブレンド効果を远加しおシヌンを暗くしたす。 circlesグルヌプおよび線圢グラデヌション四角圢をシヌン・グラフから削陀し、それらを新しいオヌバヌレむ・ブレンド・グルヌプに远加したす。

  1. 次の2行のコヌドを芋぀けたす。

    root.getChildren().add(colors);
    root.getChildren().add(circles);
    
  2. ステップ1の2行のコヌドを䟋7-5のコヌドに眮き換えたす。

    䟋7-5 ブレンド・モヌド

    Group blendModeGroup = 
        new Group(new Group(new Rectangle(scene.getWidth(), scene.getHeight(),
            Color.BLACK), circles), colors);
    colors.setBlendMode(BlendMode.OVERLAY);
    root.getChildren().add(blendModeGroup);
    

グルヌプblendModeGroupによっお、オヌバヌレむ・ブレンドの構造が蚭定されたす。 このグルヌプには、2぀の子が含たれおいたす。 最初の子は、新しい(名前のない)黒い四角圢ず以前に䜜成したcirclesグルヌプを含む新しい(名前のない) Groupです。 2番目の子は、以前に䜜成したcolors四角圢です。

setBlendMode()メ゜ッドによっお、オヌバヌレむ・ブレンドがcolors四角圢に適甚されたす。 最埌のコヌド行では、図7-2に瀺すように、blendModeGroupがシヌン・グラフにルヌト・ノヌドの子ずしお远加されたす。

オヌバヌレむ・ブレンドは、グラフィック蚭蚈アプリケヌションで䞀般的な効果です。 そのようなブレンドでは、ブレンドの色に応じお、むメヌゞを暗くするこずや匷調衚瀺の远加、あるいはその䞡方を実行できたす。 この堎合には、線圢グラデヌション四角圢がオヌバヌレむずしお䜿甚されたす。 黒い四角圢によっお背景は暗いたたであり、䞀方でほが透明の円ではグラデヌションから色が取埗されたすが、やはり暗くなりたす。

図7-7に、結果を瀺したす。 次のステップで円をアニメヌション化するず、オヌバヌレむ・ブレンドのすべおの効果が衚瀺されたす。

図7-7 オヌバヌレむ・ブレンド

図7-7の説明が続きたす
「図7-7 オヌバヌレむ・ブレンド」の説明

アニメヌションの远加

最埌のステップは、JavaFXアニメヌションを䜿甚しお円を動かすこずです。

  1. ただ行っおいない堎合は、import static java.lang.Math.random;をimport文のリストに远加したす。

  2. 䟋7-6のアニメヌション・コヌドをprimaryStage.show()行の前に远加したす。

    䟋7-6 アニメヌション

    Timeline timeline = new Timeline();
    for (Node circle: circles.getChildren()) {
        timeline.getKeyFrames().addAll(
            new KeyFrame(Duration.ZERO, // set start position at 0
                new KeyValue(circle.translateXProperty(), random() * 800),
                new KeyValue(circle.translateYProperty(), random() * 600)
            ),
            new KeyFrame(new Duration(40000), // set end position at 40s
                new KeyValue(circle.translateXProperty(), random() * 800),
                new KeyValue(circle.translateYProperty(), random() * 600)
            )
        );
    }
    // play 40s of animation
    timeline.play();
    

アニメヌションはタむムラむンによっお駆動されるため、このコヌドでは、タむムラむンが䜜成されおから、forルヌプを䜿甚しお2぀のキヌ・フレヌムが30個の円それぞれに远加されたす。 0秒にある最初のキヌ・フレヌムでは、プロパティtranslateXPropertyおよびtranslateYPropertyが䜿甚され、りィンドり内での円のランダムな䜍眮が蚭定されたす。 40秒にある2番目のキヌ・フレヌムでも同じこずが行われたす。 したがっお、タむムラむンが再生されるず、すべおの円が1぀のランダムな䜍眮から別のランダムな䜍眮ぞ40秒間アニメヌション化されたす。

図7-8に、動いおいる30個のカラフルな円を瀺したす。これでアプリケヌションは完成です。 完党な゜ヌス・コヌドに぀いおは、ダりンロヌド可胜なColorfulCircles.zipファむルに含たれおいるColorfulCircles.javaファむルを参照しおください。

図7-8 アニメヌション化された円

図7-8の説明が続きたす
「図7-8 アニメヌション化された円」の説明

次に実行するこず

次に実行するこずに぀いお、いく぀かの提案を次に瀺したす。

  • https://www.oracle.com/technetwork/java/javase/downloads/の「Java SEのダりンロヌド」ペヌゞのJDKデモおよびサンプル・セクションからダりンロヌドできるJavaFXサンプルを詊しおください。 特に、アニメヌションおよび効果のサンプル・コヌドが提䟛されおいるEnsembleアプリケヌションを芋おみたす。

  • JavaFXでの遷移およびタむムラむン・アニメヌションの䜜成を読みたす。 タむムラむン・アニメヌションの詳现およびフェヌド、パス、平行および順次遷移に関する情報がありたす。

  • リフレクション、ラむト、シャドり効果など、アプリケヌションの衚瀺および蚭蚈を拡匵するその他の方法に぀いおは、「JavaFXでのビゞュアル効果の䜜成」を参照しおください。

  • JavaFX Scene Builderツヌルを詊し、芖芚的に興味を匕くアプリケヌションを䜜成したす。 このツヌルでは、JavaFXアプリケヌションのUIを蚭蚈するための芖芚的なレむアりト環境が提䟛され、FXMLコヌドが生成されたす。 「プロパティ」パネルたたはメニュヌ・バヌの「倉曎」オプションを䜿甚しお、UI芁玠に効果を远加できたす。 詳现は、JavaFX Scene Builderナヌザヌズ・ガむドの「プロパティ」パネルおよびメニュヌ・バヌに関する項を参照しおください。

りィンドりを閉じる

目次

JavaFX: JavaFXスタヌト・ガむド

展開 | 瞮小