2011年2月9日水曜日

マウスイベントを最下層でひろうために。

CS3の時代にFlashで作ったAS3を見返して、FLEX4で実行させてみます。
クラスとしては後述の【keyAndMouse】クラスとしました。
keyAndMouseと言いながらも、keyは、ctrlとshiftをチェックするだけです。
要するにFLASHの、階層全てにイベントが発生するという特徴をいかして、
たとえボタンをクリックしてもkeydownがとれるように使います。
何につかうかといえば、何らかのGUIとしか言いようがないですけど、
今作ってるものには必要なんで^^;^^;
ということで、使い方は、mxmlのなかで、
  1. ~~略~~  
  2. public function MD(e){  
  3.  LL.text = "--M1---" + kam.getCS();  
  4. }  
  5. public function MU(e){  
  6.  LL.text = "--M2---" + kam.getCS();  
  7. }  
  8. public function MM(e){  
  9.  LL.text = "--M3---" + (ct++) + "/ " + kam.getCS();  
  10. }  
  11. public function MO(e){  
  12.  LL.text = "--M4---" + kam.getCS();  
  13. }  
  14. ~~略~~  
  15. protected function application1_creationCompleteHandler(event:FlexEvent):void  
  16. {  
  17.  kam = new keyAndMouse(this);   
  18.  kam.setMD(MD);  
  19.  kam.setMU(MU);  
  20.  kam.setMM(MM);  
  21.  kam.setMO(MO);  
  22. ~~略~~  
って感じです。
要するに、、最下層のマウスイベントを、自分のクラス内にもってきたい時につかうのです。
まぁサンプルはどっちにしても同じ階層ですけど、このkamなるインスタンスを、引数として
別のクラスとかにもってって、そこで使うことをイメージしてます。
CS3のFLASHで作ってたときは、コンストラクタの引数はthisではなくstageでしたが、
引数をthis.stageにすると、
メインスレッド (中断 : TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。)
といって怒られるので、thisに変更したのですが、実は、単に書く場所がマズかっただけで、
applicationCompleteHandlerで設定してやればOKでした。怠慢でした^^;^^;

ってことで、クラスは以下。たいしたことないっすけどね。
あぁ、あんまり型を書かない人なんで、すんません。。
  1. package{  
  2.  //----------------------------------  
  3.  import flash.display.MovieClip;  
  4.  import flash.display.Sprite;  
  5.  import flash.events.Event;  
  6.  import flash.events.KeyboardEvent;  
  7.  import flash.events.MouseEvent;  
  8.  import flash.ui.*;  
  9.  //----------------------------------  
  10.  public class keyAndMouse extends Sprite{  
  11.   var father  = null;  
  12.   var bControl = false;  
  13.   var bShift  = false;  
  14.   var funcMD  = null; // mouseDown event handler  
  15.   var funcMU  = null; // mouseUp   event handler  
  16.   var funcMM  = null; // mouseMove event handler  
  17.   var funcMO  = null; // mouseOver event handler  
  18.   var bKeep  = false;  
  19.   //--------------------  
  20.   var bMouseDown = false;  
  21.   //--------------------  
  22.   public function setMD(f){ funcMD = f;  }  
  23.   public function setMU(f){ funcMU = f;  }  
  24.   public function setMM(f){ funcMM = f;  }  
  25.   public function setMO(f){ funcMO = f;  }  
  26.   //--------------------  
  27.   public function getCS(){  
  28.    if(bControl && bShift) return 3;  
  29.    else if(bShift)   return 2;  
  30.    else if(bControl)  return 1;  
  31.    return 0;  
  32.   }  
  33.   //--------------------  
  34.   public function md(e){ if(funcMD) funcMD(e); }  
  35.   public function mu(e){ if(funcMU) funcMU(e); }  
  36.   public function mm(e){ if(funcMM) funcMM(e); }  
  37.   public function mo(e){ if(funcMO) funcMO(e); }  
  38.   //--------------------  
  39.   function keyAndMouse(f,bb:Boolean=true){  
  40.    bKeep = bb;  
  41.    father = f;  
  42.    this.addEventListener(Event.REMOVED_FROM_STAGE, removed);  
  43.    //-------------------  
  44.    // keyDown  
  45.    //-------------------  
  46.    father.addEventListener(KeyboardEvent.KEY_DOWN,  
  47.     function (e){  
  48.      if(e.keyCode == Keyboard.CONTROL) bControl = true;  
  49.      if(e.keyCode == Keyboard.SHIFT)  bShift = true;  
  50.     }  
  51.    );  
  52.    //-------------------  
  53.    // keyUp  
  54.    //-------------------  
  55.    father.addEventListener(KeyboardEvent.KEY_UP,  
  56.     function (e){  
  57.      if(e.keyCode == Keyboard.CONTROL) bControl = false;  
  58.      if(e.keyCode == Keyboard.SHIFT)  bShift  = false;  
  59.     }  
  60.    );  
  61.    //-------------------  
  62.    // mouseDown  
  63.    //-------------------  
  64.    father.addEventListener(MouseEvent.MOUSE_DOWN,  
  65.     function (e){  
  66.      if(bMouseDown){  
  67.       if(funcMU) funcMU(e);  
  68.       bMouseDown=false;  // 微妙な仕様  
  69.       return;     //   
  70.      }  
  71.      bMouseDown = true;  
  72.      if(funcMD) funcMD(e);  
  73.     }  
  74.    );  
  75.    //-------------------  
  76.    // mouseUp  
  77.    //-------------------  
  78.    father.addEventListener(MouseEvent.MOUSE_UP,  
  79.     function (e){  
  80.      bMouseDown = false;  
  81.      if(funcMU){  
  82.       funcMU(e);  
  83.       if(!bKeep){  
  84.        funcMD = null;  
  85.        funcMU = null;  
  86.        funcMM = null;  
  87.       }  
  88.      }  
  89.     }  
  90.    );  
  91.    //-------------------  
  92.    // mouseMove  
  93.    //-------------------  
  94.    father.addEventListener(MouseEvent.MOUSE_MOVE,  
  95.     function (e){  
  96.      if(funcMM) funcMM(e);  
  97.     }  
  98.    );  
  99.    //-------------------  
  100.    // mouseOver  
  101.    //-------------------  
  102.    father.addEventListener(MouseEvent.MOUSE_OVER,  
  103.     function (e){  
  104.      if(funcMO) funcMO(e);  
  105.     }  
  106.    );  
  107.    //-------------------  
  108.   }  
  109.   //--------------------  
  110.   // like a destructer  
  111.   //--------------------  
  112.   private function removed(e:Event):void{  
  113.    removeEventListener(Event.REMOVED_FROM_STAGE, removed);  
  114.   }  
  115.   //--------------------  
  116.  }  
  117.  //----------------------------------  
  118. }  

0 件のコメント:

コメントを投稿