I. Introduction▲
Pour travailler avec du texte dans Flash, il est nécessaire d'importer une multitude de classes afin de mettre à jour le formatage !
En effet, les classes TextFieldAutoSize, TextFieldAlign, TextFieldType, TextFormat, Font, TextField, etc. sont nécessaires pour modifier un champ texte.
Dans cet article, nous allons créer un composant qui va simplifier la création et le formatage d'un champ texte.
Ce composant n'en est pas réellement un, dans le sens où il n'implémentera pas UIComponent. Il étendra simplement la classe de base TextField et ajoutera des fonctionnalités indispensables.
II. CDCF d'un TextField▲
C'est parti pour la rédaction du CDCF (Cahier Des Charges Fonctionnel).
Les fonctionnalités que nous pourrions décrire, pour un champ de type UITextField, sont déjà toutes disponibles de manière native. La seule chose qui change, c'est la manière de les implémenter.
Nous passons donc directement à la rédaction du Cahier Des Charges Technique.
III. CDCT d'un TextField▲
Nous développons la classe UITextField. Nous implémentons également des méthodes supplémentaires sur cette classe. Celles-ci nous permettront de formater le texte sans passer par la classe TextFormat ni les autres classes annexes.
Voici l'ensemble des méthodes de la classe UITextField :
- Méthode changeFormat : elle permet de définir le formatage du texte ou d'un groupe de caractères à l'aide d'une seule et unique méthode ;
- Méthode changeLetterFormat : cette méthode permet de définir le format d'une seule lettre ;
- Méthode getLetterFormat : elle permet de récupérer le format d'une seule lettre ;
- Getter/ Setter appelé font : pour changer et récupérer la police de caractère. L'embarquement des polices sera géré automatiquement par le setter qui déterminera si la police est une police système ou non ;
- Méthode convertToInput : pour convertir le texte en champ de saisie ;
- Méthode convertToDynamic : pour convertir le texte en champ dynamique ;
- Nous implémenterons également des méthodes pour changer l'alignement et le redimensionnement automatique du texte : alignCenter, alignRight, alignLeft, alignJustify, autoSizeRight, autoSizeLeft, autoSizeCenter, autoSizeNone. Ces méthodes évitent d'utiliser les classes TextFieldAutoSize et TextFieldAlign ;
- Getters / Setters maxWidth et maxHeight : permettent de définir une largeur et une hauteur maximale ;
- Méthode destroy : et enfin nous implémentons une méthode qui permettra de détruire proprement notre composant, comme pour un UIComponent.
IV. Conclusion▲
Nous disposons maintenant d'un champ texte dont le formatage peut être changé de manière extrêmement simplifiée.
Le composant UITextField se révèle être une véritable bénédiction pour travailler avec du texte.
TextField avec des fonts dynamiques
Je vous propose d'utiliser des polices (ou fonts) dynamiques pour afficher vos champs textes.
C'est-à-dire que vous pouvez utiliser des polices originalesPolices de caractères à télécharger. Elles ne sont généralement pas disponibles dans les polices de base des systèmes d'exploitation (Windows, Linux, MAC). Il est donc nécessaire de charger ses polices dans le Flash Player.
La lecture de cet article, utiliser des polices partagées dynamiquement en AS3, devrait grandement vous faciliter la tâche !
L'Éditeur ActionScript FDT 4.0 simplifie énormément la création de swf de polices partagées en ActionScript : Téléchargez le guide d'utilisation de l'Éditeur ActionScript FDTComment utiliser le plus abouti des Éditeurs ActionScript ?.
Sources commentées :
- com.actionscriptfacile.ui.text.UITextField.as ;
- UITextFieldExample.as.
Vous trouverez ci-dessous l'ensemble des classes créées. Elles sont commentées pour vous permettre de comprendre leur fonctionnement.
Vous pouvez télécharger le fichier zip : Component TextField Framework actionscript-facile
package
com.
actionscriptfacile.
ui.
text
{
import
flash.
text
.
Font;
import
flash.
text
.
FontType;
import
flash.
text
.
TextField
;
import
flash.
text
.
TextFieldAutoSize;
import
flash.
text
.
TextFieldType;
import
flash.
text
.
TextFormat
;
import
flash.
text
.
TextFormatAlign;
import
flash.
utils.
Dictionary;
import
flash.
utils.
getDefinitionByName;
/**
* La classe UITextField est une extension de la classe flash.text.TextField de base.
* Elle inclut quelques fonctionnalités qui permettent de gérer plus facilement la mise
* en forme d'un champ texte.
*
* @author Matthieu
*/
public
class
UITextField extends
TextField
{
protected
static
var
m_allowedFonts:
Dictionary;
// Une liste des différentes polices de caractères autorisées.
protected
var
m_currentFont:
String
;
// Le nom de la police de caractère utilisée actuellement
protected
var
m_maxWidth:
Number
;
// la largeur maximale du champ texte
protected
var
m_maxHeight:
Number
;
// la hauteur maximale du champ texte
public
function
UITextField
(
)
{
super
(
);
/*
* Création d'une méthode init pour gagner des ressources,
* en effet en AS3 tout ce qui se trouve dans le constructeur n'est
* pas optimisé à la compilation,
* on met donc toutes nos instructions dans une méthode privée init
*
*/
init
(
);
}
/**
* Initialise proprement les différents éléments du composant
*
*/
private
function
init
(
):
void
{
// Si le tableau de fonts n'est pas encore initialisé alors ...
if
(
m_allowedFonts ==
null
)
{
m_allowedFonts =
new
Dictionary
(
);
// on le crée
var
fonts:
Array
=
Font.
enumerateFonts
(
true
);
// on récupère toutes les polices utilisables
var
max
:
int
=
fonts.
length
-
1
;
/**
* On boucle sur toutes les polices et on les ajoute à la liste des typos autorisées
*/
for
(
;
max
>
-
1
;
max
--
)
{
m_allowedFonts[
Font
(
fonts[
max
]
).
fontName ]
=
fonts[
max
];
}
// On définit une police par défaut
m_currentFont =
Font
(
fonts[
0
]
).
fontName;
}
// Puis on définit une hauteur et une largeur maximale théorique.
m_maxHeight =
m_maxWidth =
500
;
}
/**
* Cette fonction sert à changer le format d'un caractère
*
* @param p_letterIndex Index du caractère dont on veut changer le formatage
* @param p_propertyName Le nom de la propriété de formatage que l'on veut changer
* @param p_value La valeur de la propriété de formatage
*/
public
function
changeLetterFormat
(
p_letterIndex:
int
,
p_propertyName:
String
,
p_value:*
):
void
{
changeFormat
(
p_propertyName,
p_value,
p_letterIndex,
p_letterIndex +
1
,
false
);
}
/**
* Cette fonction sert à récupérer le format d'un caractère
*
* @param p_letterIndex Index du caractère dont on veut récupérer le formatage
* @return Un objet de type TextFormat
*/
public
function
getLetterFormat
(
p_letterIndex:
int
):
TextFormat
{
return
getTextFormat
(
p_letterIndex,
p_letterIndex );
}
/**
* Cette méthode permet un accès direct aux propriétés de l'objet TextFormat du TextField.
* Elle a pour but de simplifier la mise à jour graphique d'un champ texte par le biais
* d'un appel à une seule méthode.
* http://help.adobe.com/fr_FR/AS3LCR/Flash_10.0/flash/text/TextFormat.html
*
* @param p_propertyName nom de la propriété à changer @see flash.text.TextFormat
* @param p_value valeur de la propriété
* @param p_startIndex index de départ à partir duquel les changements opéreront dans le texte.
* @param p_endIndex index de fin.
*/
public
function
changeFormat
(
p_propertyName:
String
,
p_value:*,
p_startIndex:
int
=
-
1
,
p_endIndex:
int
=
-
1
,
p_isDefault:
Boolean
=
false
):
void
{
// Si la longueur du champ texte est inférieure à l'index maximal des caractères demandés
// alors on arrête tout
if
(
text
.
length
<
p_endIndex )
return
;
// On récupère le format des caractères compris entre p_startIndex et p_endIndex
var
format:
TextFormat
=
getTextFormat
(
p_startIndex,
p_endIndex );
// Si le textformat possède la propriété p_propertyName
if
(
format.
hasOwnProperty
(
p_propertyName ) )
{
// alors on définit la nouvelle valeur de la propriété en question
format[
p_propertyName ]
=
p_value;
}
// Si on a définit le paramètre p_isDefault à true
if
(
p_isDefault )
{
// alors le format devient le format par défaut
defaultTextFormat =
format;
}
// Enfin, on applique le format au champ texte pour les caractères spécifiés.
setTextFormat
(
format,
p_startIndex,
p_endIndex );
}
/**
* Convertir le champ texte en champ de saisie
*/
public
function
convertToInput
(
):
void
{
type
=
TextFieldType.
INPUT;
}
/**
* Convertir le champ texte en champ dynamique
*/
public
function
convertToDynamic
(
):
void
{
type
=
TextFieldType.
DYNAMIC;
}
/**
* Aligne le champ texte par le centre
*/
public
function
alignCenter
(
):
void
{
changeFormat
(
'align'
,
TextFormatAlign.
CENTER );
}
/**
* Aligne le champ texte en mode justifié
*/
public
function
alignJustify
(
):
void
{
changeFormat
(
'align'
,
TextFormatAlign.
JUSTIFY );
}
/**
* Aligne le champ texte par la gauche
*/
public
function
alignLeft
(
):
void
{
changeFormat
(
'align'
,
TextFormatAlign.
LEFT
);
}
/**
* Aligne le champ texte par la droite
*/
public
function
alignRight
(
):
void
{
changeFormat
(
'align'
,
TextFormatAlign.
RIGHT
);
}
/**
* Redimensionne automatiquement le champ texte par le centre
*/
public
function
autoSizeLeft
(
):
void
{
autoSize
=
TextFieldAutoSize.
LEFT
;
};
/**
* Précise que le champ texte ne doit plus se redimensionner automatiquement
*/
public
function
autoSizeNone
(
):
void
{
autoSize
=
TextFieldAutoSize.
NONE;
};
/**
* Redimensionne automatiquement le champ texte par la droite
*/
public
function
autoSizeRight
(
):
void
{
autoSize
=
TextFieldAutoSize.
RIGHT
;
};
/**
* Redimensionne automatiquement le champ texte par la gauche
*/
public
function
autoSizeCenter
(
):
void
{
autoSize
=
TextFieldAutoSize.
CENTER;
};
/**
* Définit la nouvelle police de caractère utilisée pour ce champ texte.
* Si la police ne fait pas partie des polices autorisées, le système va tenter
* de la retrouver. En cas d'échec la police ne sera pas changée, dans le cas contraire
* la nouvelle police sera utilisée et ajoutée à la liste des polices autorisées.
*/
public
function
set font
(
p_font:
String
):
void
{
var
fontDefinition:
Class;
if
(
m_allowedFonts[
p_font]
==
null
||
// Si la police n'est pas autorisée alors ...
Font
(
m_allowedFonts[
p_font]
).
fontType !=
FontType.
DEVICE
// Ou qu'il ne s'agit pas d'une typo système
)
{
try
{
// On tente de récupérer sa définition
fontDefinition =
getDefinitionByName
(
p_font ) as Class;
// On l'enregistre auprès du flash player
Font.
registerFont
(
fontDefinition );
// Et on l'ajoute à la liste des typos autorisées
m_allowedFonts[
p_font ]
=
new
fontDefinition
(
) as Font;
}
catch
(
e:
Error
)
{
// Dans le cas ou l'on n'est pas arrivé à récupérer la définition de la classe
// On arrête tout
return
;
}
}
// S'il s'agit d'une police du système alors emebedFonts = false sinon embedFonts = true
embedFonts
=
(
Font
(
m_allowedFonts[
p_font]
).
fontType !=
FontType.
DEVICE );
// On redéfinit la font utilisée
m_currentFont =
p_font;
// Et on applique la nouvelle police de caractères au format
changeFormat
(
'font'
,
p_font );
}
/**
* Récupère le nom de la police utilisée pour ce champ texte
*/
public
function
get
font
(
):
String
{
return
m_currentFont;
}
/**
* Récupère / définit la valeur de la largeur maximale autorisée pour ce champ texte
*/
public
function
get
maxWidth
(
):
Number
{
return
m_maxWidth;
}
public
function
set maxWidth
(
value:
Number
):
void
{
m_maxWidth =
value;
}
/**
* Récupère / définit la valeur de la hauteur maximale autorisée pour ce champ texte
*/
public
function
get
maxHeight
(
):
Number
{
return
m_maxHeight;
}
public
function
set maxHeight
(
value:
Number
):
void
{
m_maxHeight =
value;
}
/**
* Définit la largeur / hauteur du champ texte
*/
override public
function
set width
(
p_width:
Number
):
void
{
super
.
width
=
(
p_width >
m_maxWidth ) ?
m_maxWidth :
p_width;
}
override public
function
set height
(
p_height:
Number
):
void
{
super
.
height
=
(
p_height >
m_maxHeight ) ?
m_maxHeight :
p_height;
}
/**
* Détruit proprement un composant de type UITextField
*/
public
function
destroy
(
):
void
{
// La police de caractères est passée à null.
m_currentFont =
null
;
// On enlève le composant de la displayList de son parent
if
(
parent &&
parent.
contains
(
this
) )
{
parent.
removeChild
(
this
);
}
delete
this
;
}
}
}
package
{
import
com.
actionscriptfacile.
ui.
combo.
element.
ComboBoxElement;
import
com.
actionscriptfacile.
ui.
combo.
ComboBox;
import
com.
actionscriptfacile.
ui.
text
.
UITextField;
import
com.
as3facileexemple.
skin.
classic.
DefaultComboBoxSkin;
import
flash.
display.
Sprite;
import
flash.
events.
Event;
import
flash.
text
.
Font;
/**
* Exemple d'utilisation du composant UITextField
*
* @author Matthieu
*/
public
class
UITextFieldExample extends
Sprite
{
protected
var
m_comboFonts:
ComboBox;
protected
var
m_textField:
UITextField;
public
function
UITextFieldExample
(
)
{
/**
* On construit la combobox
*/
m_comboFonts =
new
ComboBox
(
);
m_comboFonts.
applySkin
(
new
DefaultComboBoxSkin
(
) );
// On écoute les changements qui interviennent dans la combobox
m_comboFonts.
addEventListener
(
Event.
CHANGE,
changeHandler );
m_comboFonts.
resize
(
300
,
100
);
m_comboFonts.
componentsHeight =
25
;
// On ajoute tous les noms de polices autorisées comme élément de la combobox
var
fonts:
Array
=
Font.
enumerateFonts
(
true
);
var
boxElement:
ComboBoxElement;
for
each (
var
font
:
Font in
fonts )
{
boxElement =
m_comboFonts.
addElement
(
font
.
fontName,
font
.
fontName );
boxElement.
labelField.
changeFormat
(
"color"
,
Math
.
random
(
) *
0X00FFFFFF);
// changement de la couleur du texte
boxElement.
labelField.
changeFormat
(
"size"
,
14
);
// changement de la taille de la police du texte
}
/**
* On construit un UITextField
*/
m_textField =
new
UITextField
(
);
m_textField.
text
=
'Enjoy '
;
m_textField.
x =
m_textField.
y =
5
;
m_textField.
width
=
m_textField.
maxWidth =
300
;
m_textField.
height
=
m_textField.
maxHeight =
30
;
m_comboFonts.
y =
m_textField.
y +
m_textField.
height
+
20
;
m_comboFonts.
x =
5
;
addChild
(
m_comboFonts );
addChild
(
m_textField );
}
/**
* Fonction servant à écouter le changement de police au sein de la combobox.
* On applique la police à l'UITextField que l'on a crée et placé sur la
* scène.
*
* @param e Evenement de type Event.CHANGE
*/
private
function
changeHandler
(
e:
Event):
void
{
m_textField.
font
=
m_comboFonts.
currentLabel;
}
}
}
IV-A. Proposez votre classe TextField▲
Et vous, comment avez-vous simplifié l'utilisation de la classe TextField : 3 commentaires
Avez-vous ajouté des fonctionnalités supplémentaires au composant UITextField ?
V. Remerciements / Téléchargements▲
Je tiens ici à remercier La Rédactrice Kalyparker pour la mise au gabarit de l'article original au format Developpez.com.
Merci beaucoup à l'équipe Developpez.com de contribuer à la diffusion du Framework ActionScript-Facile.
TéléchargezTéléchargez le Framework AS3 Facile l'ensemble des classes commentées du Framework AS3 FacileTéléchargez le Framework AS3 Facile (avec le code source et les exemples de tous les composants AS3).