カテゴリー: Flex/Flash/ActionScript

ActionScript3.0覚書 コンボボックスのTextFormat設定

ライブラリに含まれているコンボボックスのフォントを変更したいときは、スクリプトで設定する。
ラジオボタンやテキストボックスならば、

obj.setStyle(‘textFormat’,tf);

と書いてしまえば済むが、コンボボックスの場合はテキスト部分と、下に表示されるプルダウン部分両方の書式設定が必要となる。

//obj変数には、コンボボックスのインスタンスを設定しておく
var tf:TextFormat = new TextFormat("MS ゴシック", 18, 0x333333, true);

obj.textField.setStyle('textFormat',tf);
obj.textField.setStyle('disabledTextFormat',tf);
obj.dropdown.setRendererStyle('textFormat',tf);
obj.dropdown.rowHeight = 28;

ついでにrowHeightで、フォントサイズに見合った行の高さを設定しておくとよい。

ActionScript3.0覚書 ブラウザからAIR起動

久しぶりにActionScriptをやった。

ブラウザからローカルにインストールされているAIRアプリを起動する方法。
起動時にブラウザを閉じる処理を入れているけれど、これだと確認ダイアログが出てくるので、実際は別のJavaScriptを読んでいる。

launchApplicationは、マウスクリックイベントとかでしか動かない。
dispatchEventとかでマウスクリックイベントを無理やり呼び出してみたけど、launchApplicationだけ動かなかった。(他の行は動いてんのにぃ・・・)

package {

	import flash.net.URLRequest;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.system.LoaderContext;
	import flash.system.ApplicationDomain;
	import flash.events.Event;
	import flash.events.MouseEvent;

	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.display.Sprite;
	import flash.external.ExternalInterface;
	import flash.events.EventDispatcher;

	[SWF(width=600,height=120,backgroundColor=0xffffff)]
	public class Main extends Sprite {

		private var air_url:URLRequest = new URLRequest("http://airdownload.adobe.com/air/browserapi/air.swf");
		private var air_swf:Object = null;
		private var appID:String = "xxxxxxxxxx";
		private var pubID:String = "";
		private var args:Array;
		private var tx1:TextField = new TextField();
		private var btn:Sprite = new Sprite();

		public function Main() {
			tx1.defaultTextFormat = new TextFormat("", 12, 0x0033ff, true);
			tx1.autoSize = "left";
			tx1.x = 0;
			tx1.y = 10;
			tx1.width = 600;
			tx1.selectable = false;
			addChild(tx1);

			// air.swf起動
			var loader_obj:Loader = new Loader();
			var info:LoaderInfo = loader_obj.contentLoaderInfo;
			var loader_context:LoaderContext = new LoaderContext();
			loader_context.applicationDomain = ApplicationDomain.currentDomain;
			info.addEventListener(Event.INIT , loadInit);
			loader_obj.load(air_url,loader_context);
		}

		// 初期状態
		private function loadInit(e:Event):void {
		air_swf = e.target.content;
		try {
			tx1.text = "しばらくお待ちください。" ;
			air_swf.getApplicationVersion( appID, pubID, getVersion);
		} catch( err:Error ) {
			tx1.text = err.message ;
		}
		}

		// バージョン確認
		private function getVersion(version:String):void {
			if (version == null) {
				tx1.text = "アプリがインストールされていません。" ;
			} else {
				tx1.text = "下のボタンをクリックして、アプリを起動してください。" ;
				btn = createButton();
				addChild(btn);
				btn.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
				air_swf.launchApplication( appID, pubID, args);
					ExternalInterface.call("window.close()");
				});
			}
		}

		// ボタン生成
		private function createButton():Sprite{
			var tx:TextField = new TextField();
			var btn:Sprite = new Sprite();

			tx.width = 100;
			tx.defaultTextFormat = new TextFormat("", 20, 0xffffff, true);
			tx.text = " 起動 ";
			tx.autoSize = "center";
			tx.x = 0;
			tx.y = 8;
			tx.selectable = false;
			btn.addChild(tx);

			btn.graphics.lineStyle(1, 0xBBBBBB);
			btn.graphics.beginFill(0x9933ff);
			btn.graphics.drawRoundRect(0, 0, tx.width, 40, 20, 20);
			btn.graphics.endFill();
			btn.x = 100;
			btn.y = 50;
			return btn;
		}
	}
}

appIDには起動させるAIRのアプリIDを設定。
また、起動時に引数を渡したいときは、launchApplicationの3つめの引数にセットしておく。

起動させるAIR側は、ブラウザからの起動を可能にするため、(xxx)-app.xmlのallowBrowserInvocationタグ内をtrueにセットしておく。

 <allowBrowserInvocation>true</allowBrowserInvocation>

ActionScriptの面白さ

とか楽しさとか、色々できるのねっ!とかというのは、wonderflを見てて知ってたけど。
やっぱり開発してて面白い言語というのはいいなぁと思う。

この1月、業務でAirアプリを作成することになり、サーバ側のJavaの処理に送るやり方やら、フォルダ内のファイルを取得する方法やら、まぁいろいろ勉強した。

きっちり動かすまで大変だったし、FlashでのAir開発と、Flexでのそれとでは、微妙な違いがあったりするので、

あっちでできてなんでこっちでできないの!

なこともあったけど、まぁよい勉強になった。
次からは、phpでの開発に戻るのだけれど、同じように、多少「キーーーー」とか「ウギャァ・・・」とか言ってたとしても、スムーズにいく開発にしたいものだ。

ActionScript3.0覚書 SimpleButton

ActionScriptでボタンを作るやり方は色々あるようで、MovieClipを利用しButtonMode=trueにするやり方や、fl.controlsを使ってしまうやり方。
そして、SimpleButtonを使うやり方。

var sb:SimpleButton = new SimpleButton();
var b1:Sprite = new Sprite();
b1.graphics.beginFill(0x009966,1);
b1.graphics.drawRect(0,0,100,25);
b1.graphics.endFill();
//--  中略 --
sb.upState = b1;
sb.downState = b2;
sb.overState = b2;
sb.hitTestState = b2;

リファレンスに、
SimpleButton(upState:DisplayObject = null, overState:DisplayObject = null, downState:DisplayObject = null, hitTestState:DisplayObject = null)
って、書かれていたものだから、upState以外は指定しなくっても大丈夫なのかと思ってたらそうではなかった。
表示はされるんだが、ボタンとして機能してない。

どういうことなんだ!kao21.gif

って、昨日から悩んでたけど、今日分かったことは、「後からでもなんでも、とりあえず指定してやらにゃぁならん」ということだった。

ということで、up,down,over,hitTest すべてのStateプロパティにSpriteをあてがってやると、ちゃんとボタンとして機能してくれた。

かる~いワナだよ、これは。

ActionScript3.0覚書 AirのWindowが閉じるときに処理を入れたい

Flash ProfessionalでAirを開発中。
Airのウィンドウの右上の×ボタンをクリックされたときに確認ダイアログとかを出す処理を入れたいのだが、

先日載せた、

NativeApplication.nativeApplication.addEventListener(Event.EXITING, ファンクション名);

だと、どちらかというと終わったときの処理になってしまう。
FlexでAirを開発している場合の書き方は、いろんなページで書いてあるのだけど、Flashで開発してるものだから、イマイチ参考にならん。
(私、応用力とかないし・・・)

で、上司にまで「探してるけど出来ないんですぅ~」と泣き言言うと、上司も探してくれた。
「できない、デキナイ・・・」と思いながら、何気なく下のコードを書いたら、想定どおりに動いちゃった。

stage.nativeWindow.addEventListener(Event.CLOSING, ファンクション名);

で、指定したファンクションのなかにダイアログ表示処理を書けばよいことが判明。107256.gif

自己解決・・・しちゃったヨ。

でも、上司さんありがとう。時間とらせてごめんなさい。kao29.gif

ActionScript3.0覚書 文字列とバイト数

通常のTextFieldだと、複数行指定してやれば勝手に改行してくれる。
だが、ラジオボタンコントロールのラベルは改行してくれない・・・

で、ラジオボタンのTextFieldのwordWrapプロパティとかをいじればよいということ。

FLASH-JP.COM RadioButton コンポーネントの文字を自動改行させたい

だけど、そもそも指定バイト数で折り返したいときってどうすんの?と思って検索したところ、ありがたい記事発見。

yoshiweb.NET-blog ActionScriptで文字判定

この記事を元にチャレンジ。

checkCodeは参照先そのまま。
checkHalfは、バイト数を返すように変更。
getStrBytesTotalは、checkHalfの変更に伴い変更。
setReturnCodeは、オリジナル。

// 指定バイト数(default=60)で折り返し
function setReturnCode(str:String, max:int=60):String {
	var cnt:int = 0;
	var len:int = str.length;
	var s:int = 0
	var e:int = 0
	var buf:String = '';
	for (e = 0 ; e < len ; e++ ) {
		cnt += checkHalf(str.substr(e, 1));
		if (cnt >= max) {
			if (buf.length > 0) {
				buf += '\r';
			}
			buf += str.substr(s, e-s+1);
			s = e+1;
			cnt = 0;
		}
	}
	if (buf.length > 0) {
		buf += '\r';
	}
	buf += str.substr(s, e-s+1);
	return buf;
}

// 文字列のバイト数を求める
function getStrBytesTotal(str:String):int {
	var cnt:int = 0;
	var len:int = str.length;
	while (len--) {
		cnt += checkHalf(str.substr(len, 1));
	}
	return cnt;
}

// 指定文字のバイト数を求める→全角なら2、半角なら1を返す
function checkHalf(str:String):int{
	return (checkCode(str, 0x00, 0x7f) || checkCode(str, 0xFF61,0xFF9F)) ? 1 : 2; 
}

// 全半角判定→全角ならfalse、半角ならtrueを返す
function checkCode(str:String, min:uint, max:uint) {
	var len:uint = str.length;
	while (len--) {
		var num:uint = str.substr(len, 1).charCodeAt(0);
		if (num < min || num > max) {
			return false;
			break;
		}
	}
	return true;
}

とりあえず、いい塩梅にはなりました。
あんばいって塩梅って書くんだねぇ・・・よい塩加減なのね)

ActionScript覚書 TextFieldのTextFormatについて

TextFormatに「bold = true」を設定したにもかかわらず反映されない・・・kao12.gif
と思ったら、下記のリンクが非常に参考になった。

flabaka setTextFormatのメモ

要は、

  1. TextFieldに値が入っている場合のみ、setTextFormatを使用できる。
  2. 値が入っていないときは、defaultTextFormatを使用しないと反映されない。
  3. 値が入っているときには、defaultTextFormatが適用されない。

ということである。
ありがとうござるよ!kao22.gif
無事うまく表示できたでござる!!

ActionScript3.0覚書 重なり(深度)

忘れそうなので、いや、忘れてたので。

MovieClipやボタンなどを最前面に表示したいとき
this.setChildIndex(ターゲットインスタンス名, this.numChildren – 1);

逆に、最背面に表示したいとき
this.setChildIndex(ターゲットインスタンス名, 0);

絶対最前面にしたいからって、「9999」とか指定するのはムリそう・・・

ActionScript覚書 ラジオボタンやチェックボックスコンポーネントのTextFormat

日に焼けて顔が腫れて、仕事が手に付かない・・・
(って言い訳にならないよなぁ)

ラジオボタンやチェックボックスのコンポーネントを使っていて、これらのラベルのフォントを設定する場合に利用するのが、setStyleメソッド。

で、チェックボックスにチェックが入ったらラジオボタンを活性に、チェックを外したら非活性にというロジックを組んだところ、落とし穴が・・・

非活性のときのフォントが標準のままの状態になってしまっているではないか!!

というので調べたら、disabledTextFormatというのを発見。

var tf:TextFormat = new TextFormat(); 
tf.font = "MS Pゴシック"; 
tf.size = 22; 

//上が活性時、下が非活性時
A_RadioButton.setStyle('textFormat',tf);
A_RadioButton.setStyle('disabledTextFormat',tf);

なるほどねぇ・・・

ActionScript3.0覚書 イベントハンドラに引数を与える

すぐに忘れてしまうのでメモ。

同様の処理をさせたいのに、いちいち別のFunctionを作るのはメンドー!なときのやり方。
以下は、左ボタン・右ボタンで、同じMovieClipを左右に動かしたいときの方法。
moveHandlerの引数に、移動距離を与えて左右に動かすようにしている。

// 呼出元
LeftButton.addEventListener(MouseEvent.CLICK, moveHandler(-10));
RightButton.addEventListener(MouseEvent.CLICK, moveHandler(10));

//呼出先
function moveHandler(x_pos:Number = 0):Function {
	return function(e:MouseEvent):void {
		// MovieClipを左右に動かす
		mc.x += x_pos; 
	}
}

WordPressに天気予報表示を付けてみる

以下のサイトを参照に、かなり適当に作ってみた。

成果はカレンダーの下。
ウィジェットにせず、sidebar.phpincludeしているだけの適当作業。

お粗末だけど、もともと、ActionScriptで同様のブログパーツを作ろうと思ってたのに、結局セキュリティ関連でどうやっていいのかわからないから諦めたというのが、最もお粗末なところ。

このサンプル、コンパイルしなおさなきゃいけないので、動作確認がメンドクサイ。
(proxy.phpの位置なんて、パラメータで渡したらいいじゃん・・・と思うのは間違い?)