Archive for the 'ActionScript' Category

Flash Builder 4.7 で AIR SDK を最新にする

月曜日, 6月 2nd, 2014

Flash Builder 4.7で、プロジェクトを新規作成するとき、AIR SDKを変更できないし、「アップデートの有無をチェック…」しても変えられない。

そんなとき下記の方法見つけました。

[Flash Builder 4.7でAIR SDKをアップグレードする方法]
http://www.happytrap.jp/blogs/2013/04/08/10420/

無事に、AIR SDK 13.0 になりました。
もっと気軽に切り替えられると良いのですが。。。

ActionScritp3 multipart/form-dataでデータのアップロード

水曜日, 7月 31st, 2013

モバイルAIRでカメラ撮影した写真をmultipart/form-dataでWebにアップする流れのメモ。
写真がbitmapDataという段階からスタート。

// Jpeg 変換
var byteArray:ByteArray = new ByteArray();
bitmapData.encode(bitmapData.rect, new flash.display.JPEGEncoderOptions(), byteArray);

// Base64 変換
var base64Encoder:Base64Encoder = new mx.utils.Base64Encoder();
base64Encoder.encodeBytes(byteArray);

// POSTデータ作成
var formBuilder:MultipartFormDataBuilder = new jp.psyark.net.MultipartFormDataBuilder("207542376適当");
formBuilder.addPart("apiKey", "123456ホゲ");
formBuilder.addPart("inputFile", byteArray, "dummyName.jpg", true);

var urlRequest:URLRequest = new URLRequest(url);
formBuilder.configure(urlRequest);

var urlLoader:URLLoader = new URLLoader();
// ここらでイベントリスナーの追加処理。
urlLoader.load(urlRequest);

問題はPOSTデータの作成のところ。
http://www.libspark.org/wiki/psyark/MultipartFormDataBuilder
にあるMultipartFormDataBuilderを利用しましたが、うまくいきませんでした。
そんなとき、[AS3] PHPとAS3の連携 multipart/form-dataでデータのアップロード http://www.kuma-de.com/blog/2010-10-07/2352 が大変参考になりました。

ただ、このサイトのMultipartFormDataBuilder.asでもまだ動きませんでした。結論としては、追記にある最後のバウンダリの問題が原因でした。そこで、addPartの第4引数 last を追加して、バウンダリの最後に「–」が追加されるように修正しました。受け取り側をphpで実装した場合は、必要なかったです。javaのtomcatだと最後の「–」が必要でした。

理想的な修正は、configure()実行時に「–」を追加することかな。最後かどうかはコード側で勝手に判断してくれれば十分ですね。あと、Content-Type:もベタ書きも直さないと思いつつそのままw

package jp.psyark.net {
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.utils.ByteArray;
	
	/**
	 * multipart/form-dataのリクエストを作成するための簡単なクラスです。
	 */
	public class MultipartFormDataBuilder {
		protected var _boundary:String;
		protected var byteArray:ByteArray;
		
		/**
		 * コンストラクタです。
		 * 
		 * @param boundary バウンダリ(境界線)文字列です。送信する他のデータ中に出現しない文字列である必要があります。
		 */
		public function MultipartFormDataBuilder(boundary:String) {
			_boundary = boundary;
			byteArray = new ByteArray();
			addBoundary();
		}
		
		/**
		 * パート(部分)を追加します。
		 * 
		 * @param name このパートの名前です。content-dispositionヘッダのname属性に使われます。
		 * @param data このパートのデータです。ByteArray以外の値は文字列として評価されます。
		 * @param filename このパートのファイル名です。null以外の値を渡した場合、content-dispositionヘッダのfilename属性に使われます。
		 * @param last 最後のパートの時だけtrueにする。バウンダリに最後を意味する--を追加する。
		 */
		public function addPart(name:String, data:*, filename:String=null, last:Boolean = false):void {
			byteArray.writeUTFBytes('Content-disposition: form-data; name="' + name + '"');
			if (filename != null) {
				byteArray.writeUTFBytes('; filename="' + filename + '"');
				byteArray.writeUTFBytes("\r\n");
				byteArray.writeUTFBytes("Content-Type: image/jpeg"); //JPEG用
			}
			byteArray.writeUTFBytes("\r\n\r\n");
			if (data is ByteArray) {
				byteArray.writeBytes(data);
			} else {
				byteArray.writeUTFBytes(data);
			}
			byteArray.writeUTFBytes("\r\n");
			addBoundary(last);
		}
		
		/**
		 * multipart/form-dataのリクエストとして使えるように、URLRequestを設定します。
		 */
		public function configure(request:URLRequest):void {
			request.method = URLRequestMethod.POST;
			request.data = byteArray;
			request.contentType = "multipart/form-data; boundary=" + _boundary;
		}
		
		private function addBoundary(last:Boolean = false):void {
			if (last) {
				byteArray.writeUTFBytes("--" + _boundary + "--\r\n");
			} else {
				byteArray.writeUTFBytes("--" + _boundary + "\r\n");
			}
		}
	}
}

ActionScript3 BitmapDataをJpegやPNGに変換する

火曜日, 7月 30th, 2013

Flash Player 11.3 以降、BitmapDataにencodeメソッドが追加されました。
これを利用したBitmapDataのJpegやPNGへの変換方法をメモ。

var bitmapData:BitmapData = new BitmapData(100, 100, false, 0xED1A3D);
var byteArray:ByteArray = new ByteArray();
bitmapData.encode(bitmapData.rect, new flash.display.PNGEncoderOptions(), byteArray);

これで、byteArrayに変換後のデータが入ります。

bitmapData.encode()の第2引数を変えることによって、JPEGやJPEGXRにもできます。
以下の3種類

  • PNGEncoderOptions
  • JPEGEncoderOptions
  • JPEGXREncoderOptions

以下、wonderflにFlash Player 11.3以前のやり方のサンプルがあったので、forkして追加してみました。

BitmapDataのPNG, Jpeg, JpegXRへの変換 – wonderfl build flash online

// forked from kihon's flash on 2010-4-24
package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.FileReference;
    import flash.utils.ByteArray;
    import mx.graphics.codec.PNGEncoder;
    import mx.graphics.codec.JPEGEncoder;
    import com.bit101.components.PushButton;
    
    public class Main extends Sprite
    {    
        private var canvas:BitmapData;

        public function Main()
        {
            canvas = new BitmapData(100, 100, false, 0xED1A3D);
            var bitmap:Bitmap = new Bitmap(canvas);
            addChild(bitmap);
            bitmap.x = 182;
            bitmap.y = 182;
            
            new PushButton(this, 182, 282, "旧方式 save(PNG)", onMouseClick);
            new PushButton(this, 182, 302, "旧方式 save(JPEG)", onMouseClick2);
            new PushButton(this, 182, 322, "FP11.3以降 save(PNG)", onMouseClick3);
            new PushButton(this, 182, 342, "FP11.3以降 save(JPEG)", onMouseClick4);
            new PushButton(this, 182, 362, "FP11.3以降 save(JPEGXR)", onMouseClick5);
        }

        private function onMouseClick(event:Event):void 
        {
            var ba:ByteArray = new PNGEncoder().encode(canvas);
            new FileReference().save(ba, "t.png");
        }
        
        private function onMouseClick2(event:Event):void 
        {
            var ba:ByteArray = new JPEGEncoder().encode(canvas);
            new FileReference().save(ba, "t.jpeg");
        }
        
        private function onMouseClick3(event:Event):void {
            var ba:ByteArray = new ByteArray();
            canvas.encode(canvas.rect, new flash.display.PNGEncoderOptions(), ba);
            new FileReference().save(ba, "t2.png");
        }
        private function onMouseClick4(event:Event):void {
            var ba:ByteArray = new ByteArray();
            canvas.encode(canvas.rect, new flash.display.JPEGEncoderOptions(), ba);
            new FileReference().save(ba, "t2.jpeg");
        }
        private function onMouseClick5(event:Event):void {
            var ba:ByteArray = new ByteArray();
            canvas.encode(canvas.rect, new flash.display.JPEGXREncoderOptions(), ba);
            new FileReference().save(ba, "t2.jxr");
        }
    }
}

SharedObject に Vector.<T> を保存するときのメモ

木曜日, 12月 27th, 2012

ActionScript 3.0

Vector.<String> 型を SharedObject に入れて取り出したとき躓いたのでメモ。

入れるときはそのまま入れます。

var hoges:Vector.<String> = new Vector.<String>();
...
var sharedObject:SharedObject = SharedObject.getLocal(SHARED_NAME);
sharedObject.data.hoges = hoges;

取り出すとき、そのままだとエラーとなります。

var hoges:Vector.<String>;
var sharedObject:SharedObject = SharedObject.getLocal(SHARED_NAME);
hoges = sharedObject.data.hoges;

TypeError: Error #1034: 強制型変換に失敗しました。
__AS3__.vec::Vector.<Object>@715f611 を 
__AS3__.vec.Vector.<String> に変換できません。

これは、Vector.<Object> として受け取るからですね。

そこで、キャストしてあげます。

var hoges:Vector.<String>;
var sharedObject:SharedObject = SharedObject.getLocal(SHARED_NAME);
hoges = Vector.<String>(sharedObject.data.hoges);

これで無事解決。

Adobe Flash Builder 4 Plug-in で、sdk 4.5.1、Flash Player 11.1 を利用する

日曜日, 11月 13th, 2011

Eclipse の Plug-in として利用しているためか、ネットで公開されているやり方では一部上手く行かなかったためメモメモ。
既存のファイルを置き換える手法のため、かなり強引です。
(Eclipse は、日本語化していません。Flash Builder 4 Plug-in は日本語のため、混在してます)

http://clockmaker.jp/blog/2011/02/incubator/
こちらの手法などが上手くいかなかった時ようのメモです。

まず、sdk 4.5.1 をダウンロード
http://www.adobe.com/cfusion/entitlement/index.cfm?e=flexsdk

Plugin-in のインストール先のフォルダ直下にある「sdks」を開き、解凍したフォルダを「4.5.1」という名前で保存する。
Program Files (x86)\Adobe\Adobe Flash Builder 4 Plug-in\sdks

sdks\4.5.1\frameworks\libs\player
を開き「10.2」フォルダを「10.2_orig」としてリネーム。
新たに「10.2」を作成し、
http://www.adobe.com/jp/support/flashplayer/downloads.html
から、playerglobal11_0.swc をダウンロード。playerglobal.swc にリネームして、新規作成した10.2に設置する。

Adobe Flash Builder 4 Plug-in\player\win
を開き、「10.1」フォルダを「10.1_orig」としてリネーム。
新たに「10.1」を作成し、
http://www.adobe.com/jp/support/flashplayer/downloads.html
から、flashplayer_11_sa_debug_32bit.exe をダウンロード。FlashPlayerDebugger.exe にリネームして、新規作成した10.1に設置する。

Flex Builder 4 を起動し、Windows -> Preferences -> Flash Builder -> インストールされている Flex SDK を開きます。
「追加」ボタンから、Flex 4.5 として、 Adobe Flash Builder 4 Plug-in\sdks\4.5.1 の場所を指定。

プロジェクトを作成、または既存のプロジェクトにて、Properties を開きます。
ActionScript コンパイラー を開き、Flex SDK のバージョンが 4.5 であることを確認します。
追加コンパイラー引数に、-swf-version=13 を追記します。
-locale ja_JP -swf-version=13

11の新機能である、graphics.cubicCurveTo(…) を試してみる。
graphics.lineStyle(1, 0x000000);
graphics.moveTo(0, 0);
graphics.cubicCurveTo(100, 50, 100, 200, 200, 200);
が実行出来れば完了。

mxml で Tab移動を無効化する

金曜日, 9月 3rd, 2010

focusEnabled=”false”
tabEnabled=”false”
でok

TextInput は
tabChildren=”false”
も必要。

Flash ローカル環境のセキュリティ

土曜日, 12月 13th, 2008

fontを埋め込んだswfを作成し、ロードするとき、はまりました。
膨大な時間を消費。こういうのはへとへとになりますね。
勉強不足を反省

原因は、FlashPlayerTrust での設定。
詳細は、以下が参考になります。
ローカル環境でのセキュリティについてのメモ

ActionScript 3.0のイベント処理

水曜日, 10月 1st, 2008

AdobeのActionScript 3.0のイベント処理についてのページが分かりやすい。

イベントの伝達に、

  • キャプチャ段階
  • ターゲット段階
  • バブリング段階

があるってもっと早く把握してれば良かった・・・

いくつか、役立つ?応用を思いついたので、うまくいったらまたメモしよう。

ActionScript 3 オブジェクトの重なり順を制御する

火曜日, 9月 30th, 2008

addChild()した後で、重なり順を制御する方法について、メモします。

最前面

container.setChildIndex(sprite, container.numChildren - 1);

最背面

container.setChildIndex(sprite, 0);

1つ全面へ

var index:int = container.getChildIndex(sprite);
if (index + 1 < container.numChildren) {
    container.swapChildren(sprite, container.getChildAt(index + 1));
}

1つ背面へ

var index:int = container.getChildIndex(sprite);
if (index - 1 >= 0) {
    container.swapChildren(sprite, container.getChildAt(index - 1));
}

この内容は、AdobeのFlashクイックスタート:ActionScript 3.0を使用したプログラミングにて、丁寧な解説があります。

Loggingライブラリ、ThunderBolt

木曜日, 9月 25th, 2008

Loggingライブラリとして、ThunderBoltを利用することにしました。

準備はsourceフォルダの org\osflash\thunderbolt\Logger.asをコピーして、インポートするだけです。

あとは、以下のように呼び出して利用できます。

Logger.debug("○○○", 1, 2, 3, ...);
Logger.info("○○○");
Logger.error("○○○");
Logger.warn("○○○");

また、hideプロパティーで出力のOn/Offができます。

Logger.hide = true;
Logger.info("これは出力されない。");
Logger.hide = false;

Read the rest of this entry »