RandomText

ランダムなストリングを表示して、左から順に確定していく定番トランジション。置き換える文字を文字コードで指定できるようにして、各イベントも送出してみた。

このサンプルだと、上から順に

  • 半角英数字 + 半角記号
  • 半角英字(大文字)
  • 半角英字(小文字)
  • 半角数字
  • 半角カナ

な感じでランダムになるはず。

randomtext.swf

以下、ソース

  • ActionScript
  • RandomText.as
  • Source
package {
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.ProgressEvent;
	import flash.text.TextField;

	public class RandomText extends EventDispatcher {

		private var _textField:TextField;
		private var _fixFrame:int;
		private var _minCharCode:uint;
		private var _maxCharCode:uint;

		private var _text:String;
		private var _counter:int;

		public function get textField():TextField { return _textField; }
		public function set textField(value:TextField):void {
			_textField = value;
			_text = _textField.text;
		}

		public function get fixFrame():int { return _fixFrame; }
		public function set fixFrame(value:int):void {
			_fixFrame = value;
		}

		public function get minCharCode():uint { return _minCharCode; }
		public function set minCharCode(value:uint):void {
			_minCharCode = value;
		}

		public function get maxCharCode():uint { return _maxCharCode; }
		public function set maxCharCode(value:uint):void {
			_maxCharCode = value;
		}

		public function RandomText(textField:TextField, fixFrame:int, minCharCode:uint = 33, maxCharCode:uint = 126) {
			_textField = textField;
			_fixFrame = fixFrame;
			_minCharCode = minCharCode;
			_maxCharCode = maxCharCode;

			_text = textField.text;

			textField.text = '';
		}

		public function start():void {
			_counter = 0;

			textField.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			dispatchEvent(new Event(Event.OPEN, false, false));
		}

		private function onEnterFrame(e:Event):void {
			var textField:TextField = e.currentTarget as TextField;
			var pointer:int = Math.floor(_counter / _fixFrame);
			var text:String = '';
			var i:int;
			for (i = 0; i < _text.length; i ++) {
				text += (i < pointer)? _text.charAt(i): getRandomString();
			}
			textField.text = text;

			if(!(_counter % _fixFrame)) dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS, false, false, pointer, _text.length));
			if (pointer == _text.length) {
				textField.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
				dispatchEvent(new Event(Event.COMPLETE, false, false));
			}
			_counter ++;
		}

		private function getRandomString():String {
			var randomCharCode:int = _minCharCode + Math.random() * (_maxCharCode - _minCharCode);
			return String.fromCharCode(randomCharCode);
		}


	}

}
  1. package {
  2.     import flash.events.Event;
  3.     import flash.events.EventDispatcher;
  4.     import flash.events.ProgressEvent;
  5.     import flash.text.TextField;
  6.  
  7.     public class RandomText extends EventDispatcher {
  8.  
  9.         private var _textField:TextField;
  10.         private var _fixFrame:int;
  11.         private var _minCharCode:uint;
  12.         private var _maxCharCode:uint;
  13.  
  14.         private var _text:String;
  15.         private var _counter:int;
  16.  
  17.         public function get textField():TextField { return _textField; }
  18.         public function set textField(value:TextField):void {
  19.             _textField = value;
  20.             _text = _textField.text;
  21.         }
  22.  
  23.         public function get fixFrame():int { return _fixFrame; }
  24.         public function set fixFrame(value:int):void {
  25.             _fixFrame = value;
  26.         }
  27.  
  28.         public function get minCharCode():uint { return _minCharCode; }
  29.         public function set minCharCode(value:uint):void {
  30.             _minCharCode = value;
  31.         }
  32.  
  33.         public function get maxCharCode():uint { return _maxCharCode; }
  34.         public function set maxCharCode(value:uint):void {
  35.             _maxCharCode = value;
  36.         }
  37.  
  38.         public function RandomText(textField:TextField, fixFrame:int, minCharCode:uint = 33, maxCharCode:uint = 126) {
  39.             _textField = textField;
  40.             _fixFrame = fixFrame;
  41.             _minCharCode = minCharCode;
  42.             _maxCharCode = maxCharCode;
  43.  
  44.             _text = textField.text;
  45.  
  46.             textField.text = '';
  47.         }
  48.  
  49.         public function start():void {
  50.             _counter = 0;
  51.  
  52.             textField.addEventListener(Event.ENTER_FRAME, onEnterFrame);
  53.             dispatchEvent(new Event(Event.OPEN, false, false));
  54.         }
  55.  
  56.         private function onEnterFrame(e:Event):void {
  57.             var textField:TextField = e.currentTarget as TextField;
  58.             var pointer:int = Math.floor(_counter / _fixFrame);
  59.             var text:String = '';
  60.             var i:int;
  61.             for (i = 0; i < _text.length; i ++) {
  62.                 text += (i < pointer)? _text.charAt(i): getRandomString();
  63.             }
  64.             textField.text = text;
  65.  
  66.             if(!(_counter % _fixFrame)) dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS, false, false, pointer, _text.length));
  67.             if (pointer == _text.length) {
  68.                 textField.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  69.                 dispatchEvent(new Event(Event.COMPLETE, false, false));
  70.             }
  71.             _counter ++;
  72.         }
  73.  
  74.         private function getRandomString():String {
  75.             var randomCharCode:int = _minCharCode + Math.random() * (_maxCharCode - _minCharCode);
  76.             return String.fromCharCode(randomCharCode);
  77.         }
  78.  
  79.  
  80.     }
  81.  
  82. }

実行してるサンプル。Completeイベント取得して、次のトランジションに移るとかする・・・ことあるのかなぁ。やりっぱなしなシチュエーションの方が多そう、実際問題。

  • ActionScript
  • TestClass_RandomText.as
  • Source
package  {
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;

	public class TestClass_RandomText extends Sprite {

		private var _counter:int;

		public function TestClass_RandomText() {
			_counter = 0;

			var strings:Array = [
				'Flabo ActionScript/JavaScriptでRIA!!RIA!!',
				'getColorBoundsRect()のバグ?',
				'CSS+抜きのgifでアイコンカラー切替',
				'配列のエレメントの重複を削除する',
				'カスタムイベントのtypeに’allComplete’は使えない'
			];
			var charCodeRange:Array = [
				{minCharCode: parseInt('0021', 16), maxCharCode: parseInt('007D', 16)},	// 半角英数字 + 半角記号
				{minCharCode: parseInt('0041', 16), maxCharCode: parseInt('005A', 16)}, // 半角英字(大文字)
				{minCharCode: parseInt('0061', 16), maxCharCode: parseInt('007A', 16)}, // 半角英字(小文字)
				{minCharCode: parseInt('0030', 16), maxCharCode: parseInt('0039', 16)}, // 半角数字
				{minCharCode: parseInt('FF66', 16), maxCharCode: parseInt('FF9D', 16)}  // 半角カナ
			];
			var i:int, textField:TextField, randomText:RandomText;
			for (i = 0; i < strings.length; i ++) {
				textField = createTextField(strings[i]);
				addChild(textField);

				randomText = new RandomText(textField, 5, charCodeRange[i].minCharCode, charCodeRange[i].maxCharCode);
				randomText.addEventListener(Event.OPEN, onOpen);
				randomText.addEventListener(ProgressEvent.PROGRESS, onProgress);
				randomText.addEventListener(Event.COMPLETE, onComplete);
				randomText.start();
			}
		}

		private function createTextField(str:String):TextField {
			_counter ++;

			var textFormat:TextFormat = new TextFormat();
			textFormat.font = '_等幅';
			textFormat.size = 11;
			textFormat.color = 0x000000;
			var textField:TextField = new TextField();
			textField.autoSize = TextFieldAutoSize.LEFT;
			textField.defaultTextFormat = textFormat;
			textField.text = str;
			textField.x = 10;
			textField.y = textField.height * _counter;

			return textField;
		}

		private function onOpen(e:Event):void {
			trace(e);
		}

		private function onProgress(e:ProgressEvent):void {
			trace(e);
		}

		private function onComplete(e:Event):void {
			trace(e);
		}


	}

}
  1. package  {
  2.     import flash.events.Event;
  3.     import flash.events.ProgressEvent;
  4.     import flash.text.TextField;
  5.     import flash.text.TextFieldAutoSize;
  6.     import flash.text.TextFormat;
  7.  
  8.     public class TestClass_RandomText extends Sprite {
  9.  
  10.         private var _counter:int;
  11.  
  12.         public function TestClass_RandomText() {
  13.             _counter = 0;
  14.  
  15.             var strings:Array = [
  16.                 'Flabo ActionScript/JavaScriptでRIA!!RIA!!',
  17.                 'getColorBoundsRect()のバグ?',
  18.                 'CSS+抜きのgifでアイコンカラー切替',
  19.                 '配列のエレメントの重複を削除する',
  20.                 'カスタムイベントのtypeに’allComplete’は使えない'
  21.             ];
  22.             var charCodeRange:Array = [
  23.                 {minCharCode: parseInt('0021', 16), maxCharCode: parseInt('007D', 16)}, // 半角英数字 + 半角記号
  24.                 {minCharCode: parseInt('0041', 16), maxCharCode: parseInt('005A', 16)}, // 半角英字(大文字)
  25.                 {minCharCode: parseInt('0061', 16), maxCharCode: parseInt('007A', 16)}, // 半角英字(小文字)
  26.                 {minCharCode: parseInt('0030', 16), maxCharCode: parseInt('0039', 16)}, // 半角数字
  27.                 {minCharCode: parseInt('FF66', 16), maxCharCode: parseInt('FF9D', 16)}  // 半角カナ
  28.             ];
  29.             var i:int, textField:TextField, randomText:RandomText;
  30.             for (i = 0; i < strings.length; i ++) {
  31.                 textField = createTextField(strings[i]);
  32.                 addChild(textField);
  33.  
  34.                 randomText = new RandomText(textField, 5, charCodeRange[i].minCharCode, charCodeRange[i].maxCharCode);
  35.                 randomText.addEventListener(Event.OPEN, onOpen);
  36.                 randomText.addEventListener(ProgressEvent.PROGRESS, onProgress);
  37.                 randomText.addEventListener(Event.COMPLETE, onComplete);
  38.                 randomText.start();
  39.             }
  40.         }
  41.  
  42.         private function createTextField(str:String):TextField {
  43.             _counter ++;
  44.  
  45.             var textFormat:TextFormat = new TextFormat();
  46.             textFormat.font = '_等幅';
  47.             textFormat.size = 11;
  48.             textFormat.color = 0x000000;
  49.             var textField:TextField = new TextField();
  50.             textField.autoSize = TextFieldAutoSize.LEFT;
  51.             textField.defaultTextFormat = textFormat;
  52.             textField.text = str;
  53.             textField.x = 10;
  54.             textField.y = textField.height * _counter;
  55.  
  56.             return textField;
  57.         }
  58.  
  59.         private function onOpen(e:Event):void {
  60.             trace(e);
  61.         }
  62.  
  63.         private function onProgress(e:ProgressEvent):void {
  64.             trace(e);
  65.         }
  66.  
  67.         private function onComplete(e:Event):void {
  68.             trace(e);
  69.         }
  70.  
  71.  
  72.     }
  73.  
  74. }


About this entry