name値からイベントハンドラを自動で登録
forked from あなたのイベントハンドラを教えて! (diff: 100)
あなたのイベントハンドラを教えて! * * 複数のイベント&複数のインスタンスに * イベントハンドラを設定するときに * みなさんの記述方法の違いを知りたい。 * * [ルール] * 画面上に3つのボタンが用意されており、 * クリックとロールオーバーの * イベントハンドラを記述してください。
ActionScript3 source code
/**
* Copyright mtok ( http://wonderfl.net/user/mtok )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/vJKJ
*/
// forked from clockmaker's あなたのイベントハンドラを教えて!
/**
* あなたのイベントハンドラを教えて!
*
* 複数のイベント&複数のインスタンスに
* イベントハンドラを設定するときに
* みなさんの記述方法の違いを知りたい。
*
* [ルール]
* 画面上に3つのボタンが用意されており、
* クリックとロールオーバーの
* イベントハンドラを記述してください。
*/
package {
import flash.utils.describeType;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
public class LazyHandler extends Sprite {
public namespace lazy_mouse = "http://www.matzmtok.com/namespace/lazy_mouse/";
use namespace lazy_mouse;
private var _btnA:MyButton;
private var _btnB:MyButton;
private var _btnC:MyButton;
private var _label:MyTextField;
public function LazyHandler() {
// ボタンを作成
_init();
_build();
// 自分流のイベントハンドラを記述ください
}
//lazy_mouseの名前空間と "インスタンスの名前_イベント文字列"の名前でメソッドを宣言する。
//
lazy_mouse function btnA_click(e:MouseEvent):void
{
_label.text = "A がクリックされました";
}
lazy_mouse function btnA_rollOver(e:MouseEvent):void
{
_label.text = "A がロールオーバーされました"
}
lazy_mouse function btnB_click(e:MouseEvent):void
{
_label.text = "B がクリックされました";
}
lazy_mouse function btnB_rollOver(e:MouseEvent):void
{
_label.text = "B がロールオーバーされました"
}
lazy_mouse function btnC_click(e:MouseEvent):void
{
_label.text = "C がクリックされました";
}
lazy_mouse function btnC_rollOver(e:MouseEvent):void
{
_label.text = "C がロールオーバーされました"
}
lazy_mouse function btnC_rollOut(e:MouseEvent):void{
_label.text = "C ロールアウト";
}
lazy_mouse function btnC_mouseDown(e:MouseEvent):void{
_label.text = "C マウスダウン";
}
lazy_mouse function btnC_mouseUp(e:MouseEvent):void{
_label.text = "C マウスアップ";
}
/**
* インターフェースを作る
*/
private function _build():void {
_label = new MyTextField();
_label.x = 150; _label.y = 280;
addChild(_label);
_btnA = new MyButton();
_btnA.text = "Button A";
_btnA.name = "btnA";
_btnA.x = 70; _btnA.y = 230;
addChild(_btnA);
_btnB = new MyButton();
_btnB.text = "Button B";
_btnB.name = "btnB";
_btnB.x = 190; _btnB.y = 230;
addChild(_btnB);
_btnC = new MyButton();
_btnC.text = "Button C";
_btnC.name = "btnC";
_btnC.x = 310; _btnC.y = 230;
addChild(_btnC);
}
public function _init():void
{
var container:DisplayObjectContainer = this;
var events:XMLList = describeType(MouseEvent).constant.@name;
var handlers:XMLList = describeType(LazyHandler).factory.method.(hasOwnProperty("@uri")).(@uri=="http://www.matzmtok.com/namespace/lazy_mouse/");
addEventListener(Event.ADDED, function(ev:Event):void {
var d:DisplayObject = ev.target as DisplayObject;
var m:String;
if (d && container.contains(d)) {
if (d != container) {
for (var i:int = 0; i < events.length(); i++) {
m = d.name + "_" + MouseEvent[ events[i].toString() ];
if ( handlers.(@name == m).@name.toString() != "") {
d.addEventListener( MouseEvent[ events[i] ], container[m] );
}
}
}
}
} );
addEventListener(Event.REMOVED, function(ev:Event):void {
var d:DisplayObject = ev.target as DisplayObject;
var m:String;
if (d && container.contains(d) ) {
if (d != container) {
for (var i:int = 0; i < events.length(); i++) {
m = d.name + "_" + MouseEvent[ events[i].toString() ];
if ( handlers.(@name == m).@name.toString() != "") {
d.removeEventListener( MouseEvent[ events[i] ], container[m] );
}
}
}
}
} );
}
}
}
import flash.display.*
import flash.text.*;
/**
* MyButton クラスはボタン的な挙動をするようにしたSpriteです。
*/
class MyButton extends Sprite {
private var _text:MyTextField;
/**
* 新しい MyButton インスタンスを作成します。
*/
public function MyButton(){
graphics.beginFill(0x000000);
graphics.drawRoundRect(0, 0, 100, 30, 5, 5);
addChild(_text = new MyTextField);
buttonMode = true;
}
/**
* ボタンの文言を設定します。
*/
public function set text(value:String):void {
_text.text = value;
_text.x = (100 - _text.textWidth) / 2;
_text.y = (30 - _text.textHeight) / 2;
}
}
/**
* MyTextField クラスは適当な初期設定をしただけのテキストフィールドです。
*/
class MyTextField extends TextField {
/**
* 新しい MyTextField インスタンスを作成します。
*/
public function MyTextField() {
defaultTextFormat = new TextFormat("_sans", 12, 0xFF0000);
autoSize = "left";
selectable = false;
mouseEnabled = false;
}
}