[AS3] doubleClickを受取る [Edit]

ActionScript 3.0では、イベントを取得するには、イベントリスナーへの登録が必要になりました。また、マウスイベントには、doubleClickが加わりました。ところが、普通のクリックは受取れるのに、同じ処理でダブルクリックを検出することができません。

マウスのクリックを受取る

まず、マウスの普通のクリックを受取る処理です(スクリプト001)。インスタンスはnew演算子でコンストラクタを呼出し、動的に配置することにします。

スクリプト001■インスタンスのクリックを検出する
// タイムライン: _level0
// 第1フレームアクション
// [0]クラスのインポート
import flash.display.Sprite;
import flash.events.MouseEvent;
// [1]インスタンスの生成
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x0000FF);
mySprite.graphics.drawRect(0, 0, 50, 50);
this.addChild(mySprite);
mySprite.x = 20;
mySprite.y = 20;
// [2]イベントリスナーへの登録
mySprite.addEventListener(MouseEvent.CLICK, click);
// [3]イベントハンドラメソッド(コールバック関数)の定義
function click(eventObject:MouseEvent):void {
   trace(eventObject.type); // 出力: click
}

[0]使用するクラスは、インスタンスを生成するSpriteとマウスイベントを管理するその名もMouseEventです。これらのクラスを、フルパスの名前(完全修飾クラス名)でimportします。完全修飾クラス名およびimportステートメントについては、「スクリプトでフィルタを使う − BlurFilter」をお読みください。

[1]インスタンスは、Spriteクラスで生成します。Spriteクラスを使ったインスタンスの動的な生成については、「new演算子でビジュアルオブジェクトをつくる」をご参照ください。

[2]イベントを受取るには、イベントリスナーに登録する必要があります。使うメソッドは、EventDispatcher.addEventListener()です。イベントリスナーの設定については、「ActionScript 3.0書き方教室」「3. ActionScript 3.0イベントリスナー」をご参照ください。

ターゲットは、[1]で生成したインスタンス。第1引数にはイベントのクリックを、MouseEvent.CLICKで指定します。さらに、イベントが発生したとき呼出す(コールバック)関数(function)を、第2引数として渡します。

[3]そのうえで、イベントリスナーに指定した(コールバック)関数(function)を定義します。上記スクリプト001では、テスト用として引数で受取ったMouseEventオブジェクトのtypeプロパティをtrace()関数で出力します。typeプロパティの値は発生したイベントの文字列ですので、[出力]パネルには"click"が表示されます(図001)。

図001■インスタンスをクリックすると関数が呼出される
FF060719_001.png
(コールバック)関数はイベント名を文字列で[出力]する

マウスのダブルクリックを受取る

ダブルクリックを受取る処理も、基本的にはクリックと変わらないはずです。EventDispatcher.addEventListener()メソッドに指定する第1引数のイベントは、MouseEvent.DOUBLE_CLICKに変わります。前述スクリプト001に、この変更を加えてみました(スクリプト002)。第2引数に指定する関数名は、わかりやすいようにdoubleClickに変えてあります。

スクリプト002■インスタンスのダブルクリックが検出できない
// タイムライン: _level0
// 第1フレームアクション
import flash.display.Sprite;
import flash.events.MouseEvent;
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x0000FF);
mySprite.graphics.drawRect(0, 0, 50, 50);
this.addChild(mySprite);
mySprite.x = 20;
mySprite.y = 20;
mySprite.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClick);
function doubleClick(eventObject:MouseEvent):void {
   trace(eventObject.type);
}

上記スクリプト002で、001から変更した部分は青字にしてあります。スクリプトの内容からして、この部分を変えればよさそうに思えます。しかし、実際にはダブルクリックしても、イベントが発生しません。

実はダブルクリックをイベントとして受取るかどうかは、設定ができるようになっているのです。そして、デフォルトでは、ダブルクリックを受取らない設定になっています。その設定のプロパティが、InteractiveObject.doubleClickEnabledです。ダブルクリックを受取るには、このプロパティの値をtrueに設定する必要があります。

上記スクリプト002に、InteractiveObject.doubleClickEnabledプロパティをtrueに設定するステートメントを追加すれば、インスタンスのダブルクリックが受取られるようになります(スクリプト003)。

スクリプト003■インスタンスのダブルクリックを検出する
// タイムライン: _level0
// 第1フレームアクション
import flash.display.Sprite;
import flash.events.MouseEvent;
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x0000FF);
mySprite.graphics.drawRect(0, 0, 50, 50);
this.addChild(mySprite);
mySprite.x = 20;
mySprite.y = 20;
mySprite.doubleClickEnabled = true;
mySprite.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClick);
function doubleClick(eventObject:MouseEvent):void {
   trace(eventObject.type); // 出力: doubleClick
}

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事