Come estendere un campo di testo che è già sullo stage in Flash (AS3)?
-
06-07-2019 - |
Domanda
Sto cercando un modo per estendere un TextField che è già sul palco in Flash (AS3) qualcosa del genere:
public class ChildTextField extends TextField
{
//code for childTextField comes here
}
Ho posizionato un oggetto TextField con il nome dell'istanza 'thetextfield' sullo stage. Ora vorrei dire a Flash che questo campo di testo è di tipo ChildTextField. Quindi nella mia Document Class dichiaro quel campo di testo come ChildTextField:
public class DocumentClass extends Sprite()
{
public var thetextfield : ChildTextField;
}
Questo genera un errore di tipo Coercion fallito. È possibile cambiare la classe utilizzata per un campo di testo nell'IDE Flash come si può fare con i simboli della libreria?
Soluzione
Non temere. Dovrai utilizzare ActionScript se desideri aggiungere la classe estesa del campo di testo.
EDIT: esiste un modo hack. fonte: http://board.flashkit.com/board/ archive / index.php / t-738887.html
In realtà, mi sono imbattuto in questo esatto problema prima. Nel mio caso, lo ero cercando di creare un campo di testo con comportamenti extra per altri alcuni altri artisti non programmatori da usare. io dirò tu la mia soluzione originale che è tutto as3, ma aveva un difetto fatale, e il mio soluzione attuale, che è a combinazione di as3 e jsfl.
La soluzione all as3 è eccezionale tranne per 2 cose: in primo luogo, succede a runtime anziché build-time. Quello significa che c'è una porzione piccola ma reale del tempo in cui il film non è inizializzato correttamente. Secondo, lo fa non gioca bene se ci sono più fotogrammi nel film. L'idea di base è per rilevare i campi di testo che si desidera cambiare, costruire cose per sostituirle con, quindi sostituirli sul palco. tu può farlo con entrambi estendendo TextField, o costruendo una classe che contiene un campo di testo e gestisce il file interfaccia ad esso. Diciamo che lo sei fare il primo. Aggiungi un costruttore a SmartTextField che copia tutto campi che ti interessano:
public function SmartTextField(TextField tf)
{
this.text = tf.text; //continue with copy of anything relevant.
}
nel tuo film principale hanno un codice che rileva e sostituisce TextFields vuoi sostituire
var toreplace:Array = findTextFields();
var tf:TextField;
var stf:SmartTextField;
var where:int;
for (int i = 0; i < toreplace.length;i++)
{ tf = TextField(toreplace[i]);
stf = new SmartTextField(tf);
where = getChildIndex(tf);
addChildAt(stf,where);
removeChild(tf);
}
Funziona bene, tranne i punti sopra.
La soluzione JSFL è un po 'troppo complessa per approfondire, ma ecco il nozioni di base. Avere una classe as3 che avvolge un campo di testo con il nuovo comportamento tu volere. Scrivi uno script jsfl che scorre gli elementi selezionati e se è un campo di testo, converte in a simbolo con una base di base del tuo nuovo classe wrapper. Questo ha i vantaggi che succede al momento dell'autore e cose come posizione, nome istanza e altre cose sono automaticamente conservato. Ha lo svantaggio che jsfl ha molto poco fastidioso stranezze da risolvere.
modifica: ovviamente, se questo è solo per a film singolo, potresti rinunciare al jsfl converter script, e basta farlo a mano. converti in simbolo - > involucro baseclass.