Mach3.laBlog

AS3実験室: SimpleButtonクラスをトグル出来るように拡張した「SimpleToggleButton」

この記事は賞味期限切れです。(更新から1年が経過しています)

AS3実験室: 画像を読み込んでボタンにする~SimpleButtonの巻
AS3実験室: 画像を読み込んでボタンにするに続いて、
もういい加減にしなさいというテーマですが、書いてみちゃいました。
今回は、SimpleButtonクラスを拡張してselectedプロパティを追加してトグル出来るようにしました。

SimpleToggleButton

Download : simpletogglebutton.as3.zip

大した行数はないので貼りつけておきます。

package jp.mach3.ui
{
    import flash.display.DisplayObject;
    import flash.display.SimpleButton;

    public class SimpleToggleButton extends SimpleButton
    {
        private var _upState:DisplayObject;
        private var _selectedState:DisplayObject;
        private var _selected:Boolean = false;

        public function SimpleToggleButton( upState:DisplayObject = null, 
        overState:DisplayObject = null, downState:DisplayObject = null, 
        hitTestState:DisplayObject = null, selectedState:DisplayObject = null )
        {
            super(upState, overState, downState, hitTestState);
            _selectedState = selectedState;
            render();
        }

        public function render(n:* = null):void
        {
            _upState = upState;
        }

        public function set selected( selected:Boolean ):void
        {
            if (selected) {
                upState = _selectedState;
                mouseEnabled = false;
            } else {
                upState = _upState;
                mouseEnabled = true;
            }
            _selected = selected;
        }

        public function get selected():Boolean
        {
            return _selected;
        }

        public function set selectedState( selectedState:DisplayObject ):void
        {
            _selectedState = selectedState;
        }

        public function get selectedState():DisplayObject
        {
            return _selectedState;
        }

    }
}

SimpleButtonと違う点

SimpleButton – ActionScript 3.0 コンポーネントリファレンスガイド
基本的な使い方はSimpleButtonと同じですが、
SimpleToggleButtonクラスには以下の二つのメンバが追加されています。

selectedState : DisplayObject
選択状態を表示する為のDisplayObjectを、upStateやoverState等と同様に設定します。
selected : Boolean
トグルに使用するBool値。trueにする事でselectedStateが表示され、マウスイベントが効かなくなります。falseにすると元に戻ります。
render()
コンストラクタではなく、プロパティアクセスでDisplayObjectを設定した場合に、これを呼ぶ必要があります。苦し紛れのメソッド。後述。

また、コンストラクタの引数が一つ追加されています。

SimpleToggleButton( upState:DisplayObject = null, overState:DisplayObject = null, downState:DisplayObject = null, hitTestState:DisplayObject = null, selectedState:DisplayObject = null )
selectedState
選択状態のDisplayObjectを格納します。

簡単な使い方(1)

myUpState、myOverState、myDownState、myHitTestState、mySelectedStateには
それぞれの状態に使用するDisplayObjectが格納されていると想定します。

var myButton:SimpleToggleButton = new SimpleToggleButton();

myButton.upState = myUpState;
myButton.overState = myOverState
myButton.downState = myDownState;
myButton.hitTestState = myHitTestState;
myButton.selectedState = mySelectedState;
myButton.render(); // Don't miss it !

addChild( myButton );

選択状態にトグルする場合は、プロパティアクセスでselectedをtrueにします。

myButton.selected = true;

簡単な使い方(2)

SimpleButton同様、プロパティアクセスでDisplayObjectを設定する事も出来ますが、
その場合、格納し終えた後にrender()を呼ぶ必要があります。

var myButton:SimpleToggleButton = new SimpleToggleButton();

myButton.upState = myUpState;
myButton.overState = myOverState
myButton.downState = myDownState;
myButton.hitTestState = myHitTestState;
myButton.selectedState = mySelectedState;
myButton.render(); // Don't miss it !

addChild( myButton );

render()は、upStateをプライベートメンバの_upStateにコピーするだけのメソッドです。
このクラスは、upStateをselectedStateで上書きする事でトグルを実現しているので
この処理がないとselectedが再びtrueにされた場合に表示するためのDisplayObjectが見つからなくなります。

本来であれば、upStateのセッターで記述すべきものなのですが…
元祖SimpleButtonのupStateが内部でどのように処理されているかがわからなかった為、
このようなスマートではない方法を取ることになりました。

もっと良い方法はないだろうか…
(え、まだつづくの!?)

コメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*