Spriteをクリックしたときにフォーカスを与える

クリックしたときにフォーカスを当てるのに少し戸惑ったのでメモです。まず、動作しているものはこれ。

まず、矢印のSprite。focusRectをfalseに設定にしておくとフォーカスがあたったときにフォーカスの枠が表示されなくなります。プログラム中からSpriteに明示的にフォーカスを与えたい場合は、stageのfocusプロパティにフォーカスを与えるオブジェクトを指定します。

package {
        import flash.display.Sprite;
        import flash.text.TextField;
        public class Study05Focus extends Sprite {
                public function Study05Focus():void {
                        for (var i:int = 0; i < 10; i++) {
                                var arrow:Study05Arrow = new Study05Arrow();
                                addChild(arrow);
                                arrow.x = Math.floor(320 * Math.random());
                                arrow.y = Math.floor(240 * Math.random());
                        }
                }
        }
}
package {
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.events.MouseEvent;
        import flash.events.FocusEvent;
        import flash.filters.DropShadowFilter;
        public class Study05Arrow extends Sprite {
                public function Study05Arrow():void {
                        draw(0x0000ff);

                        // フォーカスしたときに色を付けないようにする
                        focusRect = false;

                        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                        addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                        addEventListener(FocusEvent.FOCUS_IN, focusIn);
                        addEventListener(FocusEvent.FOCUS_OUT, focusOut);
                }

                private function onMouseDown(event:MouseEvent):void {
                        stage.focus = this;
                        filters = [new DropShadowFilter()];
                        startDrag();
                }

                private function onMouseUp(event:MouseEvent):void {
                        stopDrag();
                        filters = [];
                }

                private function focusIn(event:FocusEvent):void {
                        draw(0xff0000);
                }

                private function focusOut(event:FocusEvent):void {
                        draw(0x0000ff);
                }

                private function draw(color:uint):void {
                        graphics.lineStyle(1, 0x000000);
                        graphics.beginFill(color);
                        graphics.moveTo(0, 15);
                        graphics.lineTo(0, 45);
                        graphics.lineTo(60, 45);
                        graphics.lineTo(60, 60);
                        graphics.lineTo(90, 30);
                        graphics.lineTo(60, 0);
                        graphics.lineTo(60, 15);
                        graphics.lineTo(0, 15);
                        graphics.endFill();
                }
        }
}