Graphics.inject()メソッド
|
文法
|
Graphicsオブジェクト.inject(callback, data)
|
概要
|
Graphicsオブジェクトのキューに、Context2D (Canvas) APIの呼出しを挿入する。
|
引数
|
callback ー Context2Dオブジェクトをスコープとして呼出すコールバック関数。
data ー コールバック関数の引数に渡す任意の値。
|
戻り値
|
メソッドが呼出されたGraphicsオブジェクト。
|
説明
Graphicsオブジェクトのキューに、Context2D (Canvas) APIの呼出しを挿入します。第1引数のコールバック関数(callback)は、他も含めた描画処理の中に決められた順序で呼出されます。コールバック関数は、参照するGraphicsオブジェクトが描画されるCanvasのContext2Dオブジェクトをスコープとして実行されます。そのとき、第2引数のオブジェクト(data)がパラメータとして渡されます。
このメソッドは中・上級者向けに備えられました。この機能を使えば、Context2Dへの命令を他のツールから出力して、処理に加えられます。また、Canvasに直に呼出していた処理を、表示リストの中から実行できます。さらに、カラーや線のスタイルをGraphicsインスタンスの中で動的に変え続けることもできるでしょう。ただし、一般的に用いられるメソッドではありません。
Graphicsキューはつぎのような流れで描画します。
- 塗りや線のスタイルなどを定めてパスを始める。
- グラフィックスを描く。
- fill()やstroke()メソッドで描画を終える。
Graphics.inject()メソッドを使えば、ひとつのパスの中で塗りや線のスタイルが変えられます。ただし、パスの塗りや線をCanvasに描くには、前述3の描画を終える処理がなければなりません。Graphics.inject()メソッドの前に、Graphicsクラスの塗りや線を始めるメソッドが呼出されていれば、描画終了の処理は内部的に行われます。
例
まず、Canvasのメソッドで塗りの矩形を描いてみましょう。そのうえで、その中のCanvasへの描画の処理を、Graphics.inject()メソッドで実行します。HTMLドキュメントには、つぎのようにcanvas要素を置いて、id属性に識別子("myCanvas")を与えます。そして、body要素からはonload属性に定めた関数(initialize())を呼出すことにしました。
<body onLoad="initialize()">
<canvas id="myCanvas" width="240" height="180"></canvas>
</body>
|
以下のコード001は、Canvasのメソッドで青い塗りの矩形を描きます(図001)。fillStyleプロパティは塗り色を決め、fillRect()メソッドが引数で渡された領域に矩形を描きます(「<canvas>要素で定めた領域に図形を描く」参照)。
図001■Canvasに青い正方形が描かれる
コード001■Canvasのメソッドで塗りの矩形を描く
- var context;
- function initialize() {
- var canvasElement = document.getElementById("myCanvas");
- context = canvasElement.getContext("2d");
- drawRectangle(10, 10, 100, 100, "blue");
- }
- function drawRectangle(x, y, width, height, color) {
- context.fillStyle = color;
- context.fillRect(x, y, width, height);
- }
|
このコード001のCanvasへの描画を、Graphics.inject()メソッドで実行してみましょう。script要素には予めEaselJS 0.7.0(easeljs-0.7.0.min.js)を読込んでおきます。
<script src="http://code.createjs.com/easeljs-0.7.0.min.js"></script>
|
以下のコード002は、描画用のShapeオブジェクトをステージ(Stageオブジェクト)に置き、Graphicsオブジェクトを取出します(第5〜6および第8行目)。Graphics.inject()メソッドの第1引数に定めたコールバック関数には、第2引数の値ひとつしか渡せません。そこで、オブジェクト(settings)にプロパティで値を納め、第2引数としました(第7および第9行目)。
コールバック関数はContext2Dオブジェクトをスコープとして呼出されますので、Canvasのメソッドはthisを参照して呼出します(第13〜14行目)。そして、忘れてならないのが、Stage.update()メソッドでステージを描替えることです(第10行目)。コード002は、jsdo.itにも掲げました。
コード002■Graphics.inject()メソッドでCanvas APIにより塗りの矩形を描く
- var stage;
- function initialize() {
- var canvasElement = document.getElementById("myCanvas");
- stage = new createjs.Stage(canvasElement);
- var myShape = new createjs.Shape();
- var drawingGraphics = myShape.graphics;
- var settings = {
x: 10,
y: 10,
width: 100,
height: 100,
color: "blue"
};
- stage.addChild(myShape);
- drawingGraphics.inject(drawRectangle, settings);
- stage.update();
- }
- function drawRectangle(settings) {
- this.fillStyle = settings.color;
- this.fillRect(settings.x, settings.y, settings.width, settings.height);
- }
|
もうひとつ、前掲コード002に手を加えて、矩形の塗りをアニメーションさせてみましょう。Ticker.tickイベントのリスナー関数にアニメーションの処理を定めます。スクリプト全体は、後にコード003として掲げます。
まず、Graphics.inject()メソッドの第2引数に渡すオブジェクト(settings)は、新たに定めるアニメーションの関数でも使いたいので、ローカル変数とせず、つぎのように関数の外で宣言します(第2行目)。与えるオブジェクトの中身は、前掲コード001のままです(第9行目)。Ticker.tickイベントのリスナーには、これから定めるアニメーションの関数(changeColor())を渡しました(第13行目)。
- var settings;
- function initialize() {
// var settings = {
- settings = {
x: 10,
y: 10,
width: 100,
height: 100,
color: "blue"
};
- drawingGraphics.inject(drawRectangle, settings);
- createjs.Ticker.addEventListener("tick", changeColor);
- }
|
アニメーションのリスナー関数(changeColor())は、つぎのように塗りの色相を周期的に変えます。色相は角度で決まりますので、その値を入れる変数(angle)が予め宣言されています(第3行目)。リスナー関数は、0から360度の範囲で周期的に角度を増やします(第16行目)。静的メソッドGraphics.getHSL()は、引数に渡した色相・彩度・明度の値から、描画のメソッドに与えるカラー指定の文字列を返します。
Graphics.getHSL(色相, 彩度, 明度)
そこで、Graphics.getHSL()の戻り値を、Graphics.inject()メソッドの第2引数に渡したオブジェクト(settings)のブロパティに定めます(第17行目)。ご注目いただきたいのは、アニメーションの関数(changeColor())の中ではGraphicsクラスの描画メソッドをひとつも呼出していないことです。
- var angle = 0;
- function changeColor(eventObject) {
- angle = (angle + 3) % 360;
- settings.color = createjs.Graphics.getHSL(angle, 100, 50);
- stage.update();
- }
|
試してみると、Canvasに描かれた正方形の色相が周期的に変わるアニメーションになります(図002)。アニメーションの関数(changeColor())からStage.update()メソッドを呼出すと、Canvasが描き直されます(第18行目)。そのとき、Graphics.inject()メソッドの第2引数に渡しておいたオブジェクト(settings)のプロパティ値が内部的に参照されるのです。そのため、Graphicsクラスの描画メソッドを使わなくても、描かれる塗り色が変わります。コード003のスクリプト全体は、以下のとおりです。併せて、jsdo.itにも掲げました。
図002■Canvasに描かれた正方形の色相が周期的に変わる
|
→ |
|
コード003■Graphics.inject()メソッドで塗りの色相をアニメーションさせる
- var stage;
- var settings;
- var angle = 0;
- function initialize() {
- var canvasElement = document.getElementById("myCanvas");
- stage = new createjs.Stage(canvasElement);
- var myShape = new createjs.Shape();
- var drawingGraphics = myShape.graphics;
- settings = {
x: 10,
y: 10,
width: 100,
height: 100,
color: "blue"
};
- stage.addChild(myShape);
- drawingGraphics.inject(drawRectangle, settings);
- stage.update();
- createjs.Ticker.addEventListener("tick", changeColor);
- }
- function changeColor(eventObject) {
- angle = (angle + 3) % 360;
- settings.color = createjs.Graphics.getHSL(angle, 100, 50);
- stage.update();
- }
- function drawRectangle(settings) {
- this.fillStyle = settings.color;
- this.fillRect(settings.x, settings.y, settings.width, settings.height);
- }
|
[*1] Stage.update()メソッドの呼出しは、Graphics.inject()メソッドのコールバック関数の中には含めないようにしましょう。
Canvasの描画の手順は、EaselJSのGraphicsクラスのステートメントを書く順序と異なります。そのため、Graphicsキューに入れた処理を、Canvasの流れに直して実行します。コールバック関数の中にStage.update()メソッドを書くと、描画し終わるのを待たずに呼出されたりして、ステージが正しく描直されません。
|
作成者: 野中文雄
更新日: 2013年10月5日 EaselJS新バージョンのリリースにともない、タイトルを「EaselJS次期バージョン候補のGraphics.inject()メソッド」から「EaselJS 0.7.0のGraphics.inject()メソッド」に変え、本文に補正を加えた。また、「例」にコード003とその解説を追加。
作成日: 2013年7月24日