- 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;
}
