Come posso affrontare testo dinamico all'interno di un tasto?
-
26-10-2019 - |
Domanda
Ho un pulsante "artigianale" (_btn come nome esempio), con solo all'interno DynamicText (o posso dire una dynaticText per ciascuna delle quattro modalità pulsante). Il DynamicText per la modalità Up ha un nome di "_text" istanza. Quindi, se sto lavorando sulla AS della MovieClip che contiene il pulsante, come posso affrontare il testo del testo dinamico?
package {
import flash.display.MovieClip;
import flash.display.SimpleButton;
public class container extends MovieClip {
var _btn:button;
public function container() {
_btn= new button;
this.addChild(_btn);
switch (_btn._text.text)
{
case "a": doAFunction();
case "b": doBFunction();
case "c": doCFunction();
}
}
}
}
Qual è il problema con il mio codice?
Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.
Soluzione
Quando create un simbolo di pulsante in Flash Professional, il simbolo diventa un'istanza di SimpleButton
. Se si desidera accedere gli oggetti di visualizzazione che hai creato nel simbolo del pulsante, per esempio dinamica textfield, è necessario accedervi tramite le proprietà SimpleButton
, upState
, overState
e downState
dell'oggetto hitTestState
.
Ho creato una funzione di utilità che è possibile includere nel progetto per ottenere textfields dinamici. La funzione viene chiamata getDTFFromSB()
(ottenere textfield dinamico dal SimpleButton).
La funzione prende il simpleButton
argomenti e state
. L'argomento simpleButton
è ovviamente per l'oggetto SimpleButton
in questione, e l'argomento state
è per specificare quali proprietà statale (upState
, overState
, downState
e hitTestState
) il campo di testo si trova con i rispettivi valori di stringa: "up", "over", "down" e "hit".
La funzione restituisce un oggetto Object
che è o un oggetto TextField
, oggetto Vector.<TextField
o nullo.
Questa è la funzione di utilità 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
Ho anche creato un esempio del suo utilizzo. Nella biblioteca ho un simbolo di pulsante che ho esportato per ActionScript. Il simbolo del tasto ha un campo di testo dinamico nel suo stato "up" e il valore della sua proprietà text
è "a". Ecco il codice nella classe documento:
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
Quando creo una nuova istanza del simbolo di pulsante, chiamato _myButton
, ho analizzarlo alla funzione getDTFFromSB()
e memorizzare l'oggetto restituito in un oggetto locale, chiamato returnedObject
. Poi io uso if per determinare il tipo di oggetto di ritorno, e se si tratta di un TextField
object, I store it in a local
TextFieldobject. Now if I trace the
textproperty of the
TextField` oppongo ottengo "a".
Altri suggerimenti
"pulsante" non è noto in questo script -. Se si desidera creare un pulsante standard, uso new Button()
(con capitale B)
e penso pulsante non ha alcun attributo di testo, ma uno che si chiama "etichetta".
provare a utilizzare _btn.label
.
package {
import flash.display.MovieClip;
//import flash.display.SimpleButton;
import fl.controls.Button
public class container extends MovieClip {
var _btn:button;
public function container() {
_btn= new button;
this.addChild(_btn);
switch (_btn.label)
// switch (_btn._text.text)
{
case "a": doAFunction();
case "b": doBFunction();
case "c": doCFunction();
}
}
}
}