Фокус: удаленный из DL объект не теряет фокус.
Может быть старая багофича.
Суть: ставим фокус (stage.focus = child) на дитё, внука или правнука и т.д. Удаляем родителя из дисплейлиста. Фокус остается прежним stage.focus == child // true.
Как использовать: кликаем на красный квадратик и жмем кнопочку "пробел". В текстовом поле появится имя удаленного из дисплейлиста дитя.
Как ожидается: удаление объекта, на котором есть фокус приводит к обнулению stage.focus.
Комментарий: удаление из дисплейлиста непосредственно объекта, ссылающегося в stage.focus приводит к обнулению stage.focus.
Тестировал FP 10.1 - 11.4 release
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2013. Dimarik // /////////////////////////////////////////////////////////////////////////////// package { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.Graphics; import flash.display.InteractiveObject; import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.text.TextField; /** * @author Dimarik * @version 1.0 * @langversion 3.0 * @playerversion 9.0 * */ [SWF(width="200", height="200", frameRate="12", backgroundColor="#E0EEEE")] public class FocusTest extends Sprite { public function FocusTest() { super(); const s:Sprite = new Sprite(); s.focusRect = false; s.mouseEnabled = false; s.addEventListener(KeyboardEvent.KEY_UP, this.handler_keyUp); s.name = 'foobar'; const g:Graphics = s.graphics; g.beginFill(0xFF0000); g.drawRect(0, 0, 100, 100); g.endFill(); const s1:Sprite = new Sprite(); s1.addChild(s); super.addChild(s1); s1.y = 100; super.stage.addEventListener(MouseEvent.CLICK, this.handler_mouse); super.addChild(this._t); } private const _t:TextField = new TextField(); private function handler_keyUp(event:KeyboardEvent):void { this._t.text = super.stage.focus.name; // Bingo! } private function handler_mouse(event:MouseEvent):void { const s:Sprite = event.target as Sprite; if ( s && s.parent === this ) { super.stage.removeEventListener(MouseEvent.CLICK, this.handler_mouse); super.stage.focus = s.getChildAt(0) as InteractiveObject; super.removeChild(s); } } } }
Всего комментариев 9
Комментарии
![]() ![]() |
|
Даешь живой пример в блоге!
![]() |
![]() ![]() |
|
Аха, спасибо. Залил.
|
![]() ![]() |
|
Это скорее фича, чем баг. Можно использовать на скрытом TextField для отлова символа нажатой клавиши.
|
![]() ![]() |
|
Имеешь ввиду, на удаленном из дисплейлиста TextField?
|
![]() ![]() |
|
Да, хотя я не пробовал.
|
![]() ![]() |
|
![]() ![]() |
|
Ну вот ещё слушать всякие REMOVED_FROM_STAGE
|
![]() ![]() |
|
Возможно предполагается ручное переопределение.
|
Последние записи от dimarik
- Memory allocation на Vector.<IInterface> (07.05.2015)
- [Starling] Тормози меня плавно! (28.10.2014)
- [Starling идиотизмы] Об интерактивных событиях (02.10.2014)
- О типах исключений. (23.04.2014)
- Немного о Vector и ByteArray (28.03.2014)