SWFから動的にPDFファイルを生成するためのライブラリであるAlivePDFをちょっと使ってみました。
alivepdf – Project Hosting on Google Code
AIRなら単体でのPDF出力も可能なようですが、SWFファイルからだと単体では無理で、サーバー側にファイル出力用(?)のphpプログラムを設置する必要があるようです。ただ、そのphpプログラムも提供されていたので、とりあえず単純なプログラムを組んで試してみました。
(続きを読む…)

SWFから動的にPDFファイルを生成するためのライブラリであるAlivePDFをちょっと使ってみました。
alivepdf – Project Hosting on Google Code
AIRなら単体でのPDF出力も可能なようですが、SWFファイルからだと単体では無理で、サーバー側にファイル出力用(?)のphpプログラムを設置する必要があるようです。ただ、そのphpプログラムも提供されていたので、とりあえず単純なプログラムを組んで試してみました。
(続きを読む…)
AS3から実装された、マウスホイールを検知するMouseEvent.MOUSE_WHEELイベントはMacでは動作しない、というのは知っていて、その問題を解消するためのライブラリがあるという話も聞いていたのですが、実際に使ってみる機会に遭遇したので、備忘録もかねて導入までのフローをメモしてみました。ちなみに参考にしたのはfeb19さんの以下の記事:
導入したライブラリはSWFWheelです。実際の導入フローは以下の通り:
(続きを読む…)
またまた今更ながらの備忘録メモ。FlashPlayer8から使えるようになったBitmapDataクラスによって、動的にフィルターをかけたり、グラデーションのついたマスク表現などを使えるようになりました。
が、フィルターやグラデーションマスクといった機能、サイズ(ファイルサイズではなく、width x heightのサイズ)の大きな画像やオブジェクトに対しては効きません。具体的には、対象となるオブジェクトのwidthまたはheightが2880ピクセルを超過すると、こうした機能が無効になります。
で、その詳しい理由については下記のURLが詳しい:
Flash 8 のイメージ API の概要 | デベロッパーセンター
該当する部分の引用:
メモ : Flash Player では、ビットマップの最大サイズは幅、高さいずれも 2880 ピクセルに制限されています。この制約よりも大きい BitmapData インスタンスを作成しようとすると、ビットマップは作成されません。これは、クライアントの RAM を使い切るような Flash ムービーを作成できないようにするために設定されています。2880 × 2880 ピクセルのビットマップには、約 32 MB 程度の RAM が必要です。
残念ながらFlashPlayer10でもまだこの点についての変更は無い模様。なぜこの記事を書いてるかというと、今現在この問題で引っかかってるため。さて、どうして回避したものか・・・。
kaedeさんからコメントで情報いただきましたが、FlashPlayer10からはBitmapDataサイズの制限が拡大されていますね。
BitmapData – ActionScript 3.0 言語およびコンポーネントリファレンス
当該部分を引用:
AIR 1.5 および Flash Player 10 では、BitmapData オブジェクトの最大サイズは幅または高さが 8,192 ピクセルで、ピクセルの総数は 16,777,216 を超えないようにする必要があります(したがって、BitmapData オブジェクトの幅が 8,192 ピクセルの場合、高さは 2,048 ピクセル以下にする必要があります)。Flash Player 9 以前および AIR 1.1 以前では、高さの制限は 2,880 ピクセル、幅の制限は 2,880 ピクセルです。幅または高さに 2880 より大きい値を指定すると、新しいインスタンスは作成されません。
なるほど、8192 x 8192ピクセル、ってのはダメなんですね。で、改めて今回作業してるファイルを見ると、cacheAsBitmapかけようと思ったインスタンスの横幅が9600ピクセル・・・。そ、そりゃあダメですよね。
「addEventListenerの書き方の定番」や「ステージのインスタンスを自動宣言」と同じような、備忘録を兼ねたas3メモ。
as3で他ページへのリンクを実装する場合、通常はnavigateToURLメソッドが使われます。
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.net.navigateToURL;
import flash.net.URLRequest;
public class Main extends MovieClip {
btn.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
}
public var btn:MovieClip;
public function onBtnClick(e:MouseEvent):void {
var url:String = "http://www.tonpoo.com/";
var req:URLRequest = new URLRequest(url);
navigateToURL(req, "_self");
}
}
まず、”name”, “birth”, “part”というプロパティを持つオブジェクトを生成し、それぞれのプロパティに値を入れる。
var obj1:Object = new Object(); obj1.name = "John"; obj1.birth = 1940; obj1.part = "guitar"; trace(obj1.name); //出力:John
次に、このオブジェクトのコピーを作成し、一部のプロパティを変更するために、以下のスクリプトを実行する。
var obj2:Object = obj1; obj2.name = "George"; obj2.birth = 1943; trace(obj1.name, obj2.name); //出力:George George
すると、コピー先(obj2)だけでなく、コピー元(obj1)のプロパティまでも変更されてしまっている。
これは、obj2 = obj1; としたとき、obj1をコピーしているのではなく、obj1への参照を作成しているにすぎないためである。
(続きを読む…)
「Flash(swf)からLightboxを呼び出す」というニーズがこれまでに何回かあり、またついさっきもあって、その都度ちょっと面倒だったりしたのでメモ。なお、ウチの会社ではswfファイルの埋め込みには通常swfobject2を使ってるので、以下は「Lightbox2.04 + swfobject2 + ActionScript(ExternalInterfaceクラス)」という組み合わせが前提となっています。
まず使用するLightboxのバージョンは2.04。Lokesh Dhakar氏によるLightbox 2の公式サイトで入手。
次にベースとなるHTMLを作成。今回はとりあえずSWFObject 2 HTML and JavaScript ジェネレーターを使ってサクっと作りました。ポイントとしては、「SWFの定義」のオプションを一部変更すること。

別ドメインにある画像やxmlを読み込んで処理するswfコンテンツの制作中。ポリシーファイルが必要なのはわかっていたので、画像やxmlの置いてあるサーバー(http://www.sample.server/)のルートに下記のcrossdomain.xmlを設置。
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-access-from domain="*" secure="true" /> </cross-domain-policy>
でもって、swfの方から上記サーバーのrss(http://www.sample.server/rss.php)を読み込んだ所、問題ナシ!
続けて、JPEGファイルを読み込み、BitmapData.draw()で描画しようと思った所:
セキュリティサンドボックス侵害 : BitmapData.draw:http://www.tonpoo.com/hogehoge/foobar.swf は http://www.sample.server/images/photo.jpg にアクセスできません。ポリシーファイルが必要ですが、このメディアがロードされたとき、checkPolicyFile フラグが設定されませんでした。
あれえええええ?
おかしいなと思って調べてみたら、出てきた:
AS で別ドメインの画像を読み込むときの注意点 – てっく煮ブログ
クロスドメインポリシーファイルは設置してるけどなあ、と思いながら読んでいると下記の記述:
これ以外に、Security.loadPolicyFile() メソッドを使って、事前に読み込んでおく方法もある。
これだこれだ!というわけで早速リファレンスを参照。
Security – ActionScript 3.0 コンポーネントリファレンスガイド
でもって下記の記述を追加(www付きの場合とナシの場合と両方対応するように両方を併記)。
Security.loadPolicyFile("http://sample.server/crossdomain.xml");
Security.loadPolicyFile("http://www.sample.server/crossdomain.xml");
そしたら無事解決!
crossdomain.xmlを用意しただけで安心してちゃいかんですね・・
前にECMAScript HarmonyとActionScriptという記事を書きましたが、そのECMAScriptの最新版、ECMA-262第5版の仕様策定が完了したそうです。
・ECMAScript 第5版 承認 – スラッシュドット・ジャパン
・InfoQ: ECMAScript 5リリース
上記ページを読んでも正直よくわかんないんですが、前者の記事では
Microsoft/Yahooが主導するマイナーチェンジとバグフィックスが主のECMAScript 3.1と、 Adobe/Mozilla/Opera/Googleが主導する野心的な機能拡張である ECMAScript 4の間で対立があったが、 ECMAScript Harmonyと呼ばれる統合計画によって ES3.1をベースに ES4のサブセットを取り込む形で両者が合意した経緯がある。
・・・と書かれている一方、後者の記事では
ECMAScript 4を合理化しようという初期の試みは大失敗に終わった。結局、Adobe社のActionScriptだけが提案された変更点に対応しただけだった。
・・・と書かれています。これはつまり、
●ECMAScript本体の方は3.1をベースにES4の一部機能(仕様)を取り込むにとどまった。
●ES4に対応したのはActionScriptだけだった。
・・・というようなことなんでしょうか?
とりあえず、ActionScript次期バージョンへの影響が心配されます。AS3にやっと慣れてきた手前、この学習資産が無駄にならなきゃいいんだけど・・・。
昨日の「ステージのインスタンスを自動宣言」に続いて、AS3の開発ですぐ忘れてしまう件について、備忘録をかねて。ボタンアクションやらENTER_FRAMEやらの処理を行う際など、頻繁に使うのが「イベントリスナの登録」。例えばステージ上にbtn_mcというMovieClipがあったとして、このボタンをクリックしたらonBtnClickというメソッドを実行させたいというような場合、通常は下記のように記述します。
btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick);
これを、addEventListenerの5つめの引数をtrueにする(3つめはfalse、4つめは0)ことで、より効率的なメモリ管理を実現出来ます。
btn_mc.addEventListener(MouseEvent.CLICK, onBtnClick, false, 0, true);
詳しくは上条氏の下記記事を参照下さい。
ああ腹立たしい!!ActionScript3での開発もそれなりにやってきてるというのに、今でも結構単純な作業を行うのに思い通りにいかず、ストレスを感じることがあります。
今回は「ステージのインスタンスを自動宣言」について。