月別アーカイブ: 2009年8月

Flex 3.4 SDK の SystemManager バグ

Flex アプリケーションのプリローダーがローディングしているときにステージをクリックすると、SystemManager がランタイムエラーを発生する問題を発見しました。

この問題は、デフォルトのプリローダーを使用しても発生しますし、プリローダーのローディング時間が長ければ長いほど発生するリスクが増えます。

新規作成直後で最小状態の Flex アプリケーションでも、プリローダーが一瞬表示されるので、この隙にマウスを連打するなどしてステージをクリックすればアウトです。

原因は、SystemManager の 5649 行目です。

5646 : private function stageEventHandler(event:Event):void
5647 : {
5648 :     if (event.target is Stage)
5649 :         mouseCatcher.dispatchEvent(event);
5650 : }

mouseCatcher は、プリローダーのローディングが完了するまで NULL なのですが、stageEventHandler はプリローダー動作中も呼び出されます。つまり、mouseCatcher の NULL チェック漏れです。

この問題は Gumbo にもあったようで、Flex 4 では fix されています。
https://bugs.adobe.com/jira/browse/SDK-22682

当面の回避策
プリローダークラスを自作して、ステージの MouseEvent.MOUSE_DOWN イベントを SystemManager 内のリスナーより早く拾って、イベントの伝播を止める。

面倒だと感じる方は、以下のように DownloadProgressBar クラスを継承することをおすすめします。

package {
import flash.events.Event;
import flash.events.MouseEvent;
import mx.preloaders.DownloadProgressBar;
public class MyPreloader extends DownloadProgressBar {
    public function MyPreloader() {
        super();
        addEventListener(Event.COMPLETE, onCompleteHandler);
        addEventListener(Event.ADDED_TO_STAGE, addedToStateHandler, false, int.MAX_VALUE, true);
    }
    protected function addedToStateHandler(event:Event):void {
        stage.addEventListener(MouseEvent.MOUSE_DOWN, stageMouseDownHandler, false, int.MAX_VALUE, true);
        removeEventListener(event.type, arguments.callee);
    }
    protected function stageMouseDownHandler(event:MouseEvent):void {
        event.stopImmediatePropagation();
    }
    protected function onCompleteHandler(event:Event):void {
        stage.removeEventListener(MouseEvent.MOUSE_DOWN, stageMouseDownHandler, false);
        removeEventListener(event.type, arguments.callee);
    }
}
}

Label クラスの styleSheet プロパティ

今までアクセス制御の属性が mx_internal だった Label クラスの styleSheet プロパティが、Flex 3.4 から public に変更されました。

地味な変更ですが、地味に嬉しいことです。

早速サンプルを作りました。Label クラスのサブクラスである Text クラスを使用しています。

詳細!ActionScript 3.0 入門ノート [ 完全改訂版 ]

ありがたいことに、著者の大重さんから 『ブログの更新ちょっと止まってるみたいだし、Flex ユーザー向けに紹介しない?』 …と、今月発売されたばかりの著書を頂戴しました。

ブログの更新を滞らせて良かった♪…という冗談はさておき、真面目に紹介します。

2 冊の既刊 [*1] と大きく異なる点は、Flash Player 10 で使用できる型やクラスについて書かれている点です。現状… Flex 3 の場合、アプリケーションのターゲットプレイヤーのバージョンを意図的に 10 にしない限り、Flash Player 10 の機能は使えません。そのため Flash Player 10 の機能とは無縁…という開発者も多いと思います。

ですが、近い将来 Flex 3 から Flex 4 に開発の主流が移ったとき、Flex 4 アプリケーションは、Flash Player 10 以上のプレイヤーでないと動作しないため、Vector, Matrix3D, TextLine など、新しく用意されたクラスについての知識も必要になってきます。

これらの知識をゼロから学習するのに、この本は入門書として適切だと思います。

個人的には、「 Chapter06 Point クラスと Rectangle クラス」が一押しです。 Flex 開発者でも、少し変わったカスタムコンポーネントを作るときには、結局 UIComponent をベースにフルスクラッチしなければならないので、この手のネイティブな Flash のクラスの知識も必要になるんですよね。

興味のある方は是非。

*1 : 既刊

ちなみに、2 冊の既刊と新刊との比較について、カヤックさんが素敵にまとめています。
http://level0.kayac.com/2009/08/actionscript30.php

TLF (Text Layout Framework) と戯れる #08

Linked Containers サンプル

Linked Containers と呼ばれる機能のサンプルをアップしました。 TextFlow.flowComposer プロパティに、表示オブジェクト情報を持った複数の ContainerController インスタンスを登録することにより、柔軟なレイアウトを作ることができます。

これはなかなか面白いです。