2880pxより下にあるダイナミックテキストが表示されないの対処法

この大きさのFlashを作ることはあまりないかもしれませんが、対処方法のメモ書き。
外部XMLを読み込み表示するFlashのエンベッドwmodeを変更したところ、
下の方のテキストが表示されなくなりました。
調査したところ発生条件は、

  • FlashPlayer9以下
  • wmodeが”transparent”
  • テキストフィールドへ動的に文字列を流し込んでいる
  • そのテキストフィールドのY座標が2880px以上

でした。
対処法は以下のいずれか。

  1. 書き出し&閲覧Playerバージョンを10以上にする
  2. フォントを埋め込む
  3. cacheAsBitmap = true (ビットマップとしてキャッシュにチェック)

Flashの表示オブジェクトの限界が縦横2880pxらしいのでそれが関係していると思われる。
FlashPlayer10からはその制限が緩和されているため(参考)、
試してみたところテキストが表示されました。

該当のテキストフィールドにフォントを埋め込んでしまうのも効果あり。

表示されないだけで、文字列自体は入っているっぽかったので、
テキストを含むMovieClipのcacheAsBitmapをtrueにしたところ、これも効果あり。
今回はレギュレーションがPlayer8で固定、
日本語も入るのでフォントを埋め込むと容量が大きくなりすぎるということで、
3番の方法で対処しました。

Flash間での日本語クエリの受け渡し

Flashで生成した日本語文字列を、
ページ遷移後の別のFlashに受け渡したいという場面がありました。
なるべく簡易な方法ということで、
遷移するページURLにクエリとして日本語文字列をくっつけることに。
そのままブラウザでページ遷移すると文字列がURLエンコードされるので、
JavaScriptのdecodeURI()でデコードしてFlashに渡すということをしたのですが、
ブラウザによって動いたり動かなかったり。
動かないブラウザは2重にエスケープされているっぽい?

きっと何か方法があると思いつつ、Flash側で回避。
JSはクエリ部分を取得してFlashに渡すのみで、余計なことはしない。

送信Flashで送りたい日本語文字列をUTF-8エンコードescape()にかける。
クエリで受け取った文字列をFlash内部でunescape()すると元の日本語に戻ります。

//■送信Flashでエンコード
var str_ori:String = "トライナイン";
var str_esc:String = escape(str_ori);
trace(str_esc); //出力:%E3%83%88%E3%83%A9%E3%82%A4%E3%83%8A%E3%82%A4%E3%83%B3


//■受信Flashでデコード
trace(unescape(str_esc)); //出力:トライナイン

 
【6月28日追記】
外部から読み込んだXML等のテキストをエンコードするとうまくいかない場合が。
 System.useCodepage = false;
を明示的に前に書いてやると直るかもしれません。

自身のURLの取得

クエリを取得する等の目的で自身のURLを知りたいことがあります。
仕事でも何度かFlashの『_url』プロパティ、JSの『window.location.href』を使ったのですがその度に、

Flashの_urlは貼り付けてるHTMLのURLが取れるんだっけ?
インラインフレームの中からだとどこのURLが取れるんだっけ?

となっていたので ここにまとめておきます。
当たり前の内容です。

_root._urlとwindow.location.hrefの取得するURL
_root._urlとwindow.location.hrefの取得するURL

<iframe src=”child.html?hoge=XXXXX” >としても値がわたらなかったんですが、
iframeを跨いでクエリを取るにはどうするのがいいんでしょうね?

テキストリンクから関数を実行する

HTMLテキストから関数を実行するasfunctionメソッド、知らなかった。
下記のようなXMLをhtmlTextとしてテキストフィールドに読み込むと、
“関数を叩く!”部分のリンクを叩いて、_rootのhogeFunc関数を叩くことができます。
(こんなことをする状況がよくわからないが)

■XML
<xml>
	<Function>XMLから読み込んだHTMLテキストから、<a href="asfunction:_root.hogeFunc,hoge">関数を叩く!</a></Function>
</xml>

HTMLテキストとして読み込んで、タイムラインには以下の関数。

■AS
//@_rootタイムライン
function hogeFunc(a:String){
	trace("XMLから関数が!引数は" + a);//出力:XMLから関数が!引数はhoge
}

カンマ区切りで引数を付与することもできます。
注意点としてはテキストフィールドを基点として階層指定すること。(→_root)
AS3でも同じように書いてみましたが、動きませんでした。 AS2限定なのか?

追記:
AS3 では asfunction の代わりに TextEvent.LINK を使うそうです。
http://blog.kaihatsubu.com/archives/001637.html