Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиотизмы: кто мой папа?
Запись от BlooDHounD размещена 07.06.2010 в 20:36
для понимания материала необходимы следующие знания:
flash.text.TextField
flash.display.SimpleButton
вспомни цепочку наследования класса TextField:
TextField ► InteractiveObject ► DisplayObject ► EventDispatcher ► Object
так вот это враньё.
на самом деле там пропущен DisplayObjectContainer.
рассмотрим на примере:
package { import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; public class test extends Sprite { public function test() { super(); var t:TextField = new TextField(); t.addEventListener( Event.ADDED, this.handler_addedToStage ) t.width = 400; t.height = 200; t.htmlText = ' <' + 'img src="http://www.google.ru/logos/olympics10-hockey-hp.png" />'; super.addChild( t ); } private function handler_addedToStage(event:Event):void { if ( event.target == event.currentTarget ) return; trace( event.target ); } } }
Код:
[object Loader] [object Sprite]
что это даёт? как минимум 3 вещи:
- можем делать прелоадеры для TextField, перехватывая появление в них объектов класса Loader.
- можем пресекать появление securityError и ioError подписываясь на соответствующие события.
- мы можем выдёргивать контент из текстового поля используя вот это хак
для себя я написал такой вот класс, для перехвата детей:
package blooddy.patch.text { import flash.display.Loader; import flash.display.LoaderInfo; import flash.events.Event; import flash.events.IOErrorEvent; import flash.text.TextField; /** * @author BlooDHounD * @playerversion Flash 9 * @langversion 3.0 */ public class TextField extends flash.text.TextField { //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor */ public function TextField() { super(); super.addEventListener( Event.ADDED, this.handler_added, false, int.MAX_VALUE, true ); super.addEventListener( Event.REMOVED, this.handler_remvoed, false, int.MAX_VALUE, true ); } //-------------------------------------------------------------------------- // // Event handlers // //-------------------------------------------------------------------------- /** * @private */ private function handler_added(event:Event):void { if ( event.target !== this ) { // останавливаем расспостранение события // наши родители даже не догадываются о его существовании event.stopImmediatePropagation(); // если пришёл Loader, то надо подписаться на всяческие ошибки if ( event.target is Loader ) { // так как мы не собираемся контролировать объект, лучше подпишимся со слабыми ссылками var loader:LoaderInfo = ( event.target as Loader ).contentLoaderInfo; loader.addEventListener( Event.COMPLETE, this.handler_complete, false, int.MAX_VALUE, true ); loader.addEventListener( IOErrorEvent.IO_ERROR, this.handler_complete, false, int.MAX_VALUE, true ); } } } /** * @private */ private function handler_remvoed(event:Event):void { if ( event.target !== this ) { // останавливаем расспостранение события // наши родители даже не догадываются о его существовании event.stopImmediatePropagation(); // если пришёл Loader, то надо отписаться на всяческие ошибки if ( event.target is Loader ) { // отписываемся var loader:LoaderInfo = ( event.target as Loader ).contentLoaderInfo; loader.removeEventListener( Event.COMPLETE, this.handler_complete ); loader.removeEventListener( IOErrorEvent.IO_ERROR, this.handler_complete ); } } } /** * @private */ private function handler_complete(event:Event):void { var loader:LoaderInfo = event.target as LoaderInfo; loader.removeEventListener( Event.COMPLETE, this.handler_complete ); loader.removeEventListener( IOErrorEvent.IO_ERROR, this.handler_complete ); } } }
Всего комментариев 1
Комментарии
![]() ![]() |
|
Еще некоторые наблюдения. Текстовому полю устанавливалось htmlText = ' <img src="image.png" width="WIDTH" height="HEIGHT" />'
- При попытке удалить Loader путем Loader.parent.removeChild(Loader) или добавить дитя к Loader.parent 10 FP падал. - При удалении Sprite, бордюр вокруг текстового поля становится светло-зеленым. - Можно задавать координаты Loader'у, картинка будет смещаться по текстовому полю, обрезаясь на краях. - Удалив Sprite (маска?) картинка показывается на краях полностью. - Даже если самостоятельно задать некоторые координаты Loader'у, "пустое" место под картинку остается и выделение текста "обруливает" это место. |
|
Обновил(-а) dimarik 07.06.2010 в 22:21
|
Последние записи от BlooDHounD
- Обновление blooddy_crypto.swc до версии 0.5.1 (31.03.2016)
- Кто не успел - тот опоздал (19.04.2011)
- Обновление blooddy_crypto.swc до версии 0.3.1 (29.11.2010)
- blooddy_crypto.swc теперь умеет JSON (13.10.2010)
- Загадочный CommaExpression (06.09.2010)