Home > flash > MEMO:カスタムイベントの作成方法

MEMO:カスタムイベントの作成方法

  • Posted by: non
  • 2008年6月19日 02:09
  • flash

as3 でのカスタムイベントの作成方法をよく忘れるのでメモしておく。例として CSS ロード用のCSSLoader とそのカスタムイベント CSSLoadEvent を作成。外部 CSS を TextField に StyleSheet として設定するサンプルも載せておく。

ソースコード

package
{
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.system.System;
    import flash.events.EventDispatcher;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.text.StyleSheet;
    import CSSLoadEvent;
    
    [Event( name="cssLoadComplete", type="CSSLoadEvent" )]
    
    [Event( name="cssParseComplete", type="CSSLoadEvent" )]
    
    public class CSSLoader extends EventDispatcher
    {
        private var cssLoader:URLLoader;
        
        /**
         * 参照URL
         */
        protected var _url:String;
        
        /**
         * 未解析スタイルシート
         */
        protected var _plainText:String;
        
        /**
         * 解析済スタイルシート
         */ 
        protected var _styleSheet:StyleSheet;

        /**
         * コンストラクタ
         */ 
        public function CSSLoader( url:String, isUnicode:Boolean )
        {
            _url = url;
            _styleSheet = new StyleSheet();
            System.useCodePage = !isUnicode;
            load();
        }
        
        /**
         * ロード
         */ 
        protected function load():void
        {
            cssLoader = new URLLoader();
            cssLoader.dataFormat = URLLoaderDataFormat.TEXT;
            cssLoader.addEventListener( IOErrorEvent.IO_ERROR, errorHandler );
            cssLoader.addEventListener( Event.COMPLETE, cssLoadCompleteHandler );
            cssLoader.load( new URLRequest( _url ) );
        }
        
        protected function cssLoadCompleteHandler( event:Event ):void
        {
            try {
                _plainText = cssLoader.data;
                // ロード完了
                dispatchEvent( new CSSLoadEvent( CSSLoadEvent.LOAD_COMPLETE ) );
                _styleSheet.parseCSS( cssLoader.data );
                // 解析完了
                dispatchEvent( new CSSLoadEvent( CSSLoadEvent.PARSE_COMPLETE ) );
            } catch ( err:TypeError ) {
                trace( err.message );
            }
        }
        
        protected function errorHandler( evt:IOErrorEvent ):void
        {
            trace( "Couldn't load the style sheet file." );
        }
        
        public function get styleSheet():StyleSheet
        {
            return _styleSheet;
        }
        
        public function get plainText():String
        {
            return _plainText;
        }
    }
}

カスタムイベント CSSLoadEvent。

package
{
    import flash.events.Event;
    
    public class CSSLoadEvent extends Event
    {
        public static const LOAD_COMPLETE:String = "cssLoadComplete";
        public static const PARSE_COMPLETE:String = "cssParseComplete";
        
        public function CSSLoadEvent( type:String, bubbles:Boolean = false, cancelable:Boolean = false )
        {
            super( type, bubbles, cancelable );
        }
        
        public override function clone():Event
        {
            return new CSSLoadEvent( type, bubbles, cancelable );
        }
        
        public override function toString():String
        {
            return formatToString( "CSSLoadEvent", "type", "bubbles", "cancelable" );
        }
    }
}

サンプル

package  
{
    import flash.display.Sprite
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.AntiAliasType;
    import flash.events.Event;
    import CSSLoader;
    import CSSLoadEvent;
    
    [SWF(width="640", height="100", frameRate="30", backgroundColor="#ffffff")]
    
    public class CSSLoadTest extends Sprite 
    {
        private var textField:TextField;
        
        private var TEXT:String = "<h2>見出し見出し見出し</h2>" 
        + '<p>テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>'
        + '<p><a href="http://nondelion.com/">http://nondelion.com/</a></p>';
        
        /**
         * コンストラクタ
         */ 
        public function CSSLoadTest() 
        {
            textField = new TextField();
            textField.antiAliasType = AntiAliasType.ADVANCED;
            textField.background = true;
            textField.multiline = true;
            textField.wordWrap = true;
            textField.width = 500;
            textField.x = 70;
            textField.y = 70;
            textField.htmlText = TEXT;
            this.addChild( textField );
            
            var cssLoader:CSSLoader = new CSSLoader( "test.css", true );
            cssLoader.addEventListener( CSSLoadEvent.LOAD_COMPLETE, cssLoadCompleteHandler );
        }
        
        private function cssLoadCompleteHandler( evt:CSSLoadEvent ):void
        {
            textField.styleSheet = evt.target.styleSheet;
            textField.htmlText = TEXT;
            textField.autoSize = TextFieldAutoSize.LEFT;
        }
    }
}

読み込んだ CSS。

h2 {
    font-family: Meiryo, Osaka, Verdana;
    font-size: 16px;
    color: #EC008C;
}

p {
    font-family: Meiryo, Osaka, Verdana;
    font-size: 12px;
    color: #000000;
}

a {
    color: #333333;
}

a:hover {
    color: #00AEEF;
    text-decoration: underline;
}

実行例

Alternative content

表示するためには最新の Flash Player が必要です。

Get Adobe Flash player

ダウンロード

heteml banner

Comments:0

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Trackbacks:0

TrackBack URL for this entry
http://nondelion.com/cms/mt-tb.cgi/112
Listed below are links to weblogs that reference
MEMO:カスタムイベントの作成方法 from nondelion.com

Home > flash > MEMO:カスタムイベントの作成方法

Return to page top