フラッシュプロフェッショナルでボタンシンボルを作成すると、シンボルはSimpleButton
のインスタンスになります。ダイナミックテキストフィールドなどのボタンシンボルで作成した表示オブジェクトにアクセスするには、オブジェクトのupState
,overState
、downState
およびhitTestState
のプロパティを使用してアクセスしなければなりません。
ダイナミックなテキストフィールドを取得するためにプロジェクトに含めることができるユーティリティ関数を作成しました。この関数はgetDTFFromSB()
(シンプルボタンから動的テキストフィールドを取得)と呼ばれます。
この関数の引数は、simpleButton
とstate
です。 simpleButton
引数は、問題のSimpleButton
オブジェクトのために明らかにされ、そしてstate
引数が指定され、状態プロパティ(upState
、overState
、downState
とhitTestState
)のためであるテキストフィールドは、それぞれの文字列値を持つに位置しています:「アップ」、「オーバー」、 "ダウン"と "ヒット"。
この関数は、TextField
オブジェクト、Vector.<TextField
オブジェクトまたはnullのいずれかのObject
オブジェクトを返します。ここで
は、ユーティリティ関数getDTFFromSBは()である:
package utils
{
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.SimpleButton;
import flash.text.TextField;
/**
* get dynamic textfield from simple button
*/
public function getDTFFromSB(simpleButton:SimpleButton, state:String = "up"):Object
{
var returnObject:Object;
var displayObject:DisplayObject;
switch(state)
{
case "up" : displayObject = simpleButton.upState;
case "over" : displayObject = simpleButton.overState;
case "down" : displayObject = simpleButton.downState;
case "hit" : displayObject = simpleButton.hitTestState;
}// end switch
if(displayObject is TextField)
{
returnObject = displayObject;
}
else if(displayObject is DisplayObjectContainer)
{
var doc:DisplayObjectContainer = displayObject as DisplayObjectContainer;
var textFields:Vector.<TextField> = new Vector.<TextField>();
for(var i:uint = 0; i < doc.numChildren; i++)
{
if(doc.getChildAt(i) is TextField)
textFields.push(doc.getChildAt(i));
}// end for
if(textFields.length == 0) returnObject = null
else if(textFields.length == 1) returnObject = textFields[0]
else if(textFields.length > 1) returnObject = textFields;
}
else
{
returnObject = null;
}// end else
return returnObject;
}// end function
}// end package
私もその使用例を作成しました。ライブラリには、私がactionscriptのためにエクスポートしたボタンシンボルがあります。ボタンのシンボルには、「アップ」状態の動的テキストフィールドが1つあり、text
プロパティの値は「a」です。ここでは、コードがドキュメントクラスである:
package
{
import utils.getDTFFromSB;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
public class Main extends Sprite
{
private var _myButton:SimpleButton;
public function Main()
{
if(stage) init()
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
_myButton = new MyButton();
addChild(_myButton);
var returnedObject:Object = getDTFFromSB(_myButton);
var textField:TextField;
if(returnedObject is TextField)
{
textField = TextField(returnedObject);
}
else if(returnedObject is Vector.<TextField>)
{
textField = Vector.<TextField>(returnedObject)[0];
}
else if(returnedObject == null)
{
throw new Error("null value returned from getDTFFromSB() method");
}// end if
trace(textField.text) // ouput: a
}// end function
}// end class
}// end package
私はボタンシンボルの新しいインスタンスを作成するときに、私はgetDTFFromSB()
関数にそれを解析し、ローカルオブジェクトで返されたオブジェクトを格納し、_myButton
と呼ばれ、returnedObject
と呼ばれます。次にif文を使用して戻りオブジェクトの型を決定し、それがTextField
オブジェクト, I store it in a local
TextField object. Now if I trace the
テキストproperty of the
TextField`オブジェクトの場合は "a"を取得します。
'container'クラスはドキュメントクラスですか? – Taurayi
はい、それは.....あなたがフラッシュファイルのASクラスを意味する場合です。^^ " –
あなたは私の答えを受け入れてくれました、私はそれをうまく説明してくれればと思っています。 – Taurayi