szambaux
Messages postés56Date d'inscriptionmercredi 5 septembre 2007StatutMembreDernière intervention22 juillet 2010
-
17 avril 2009 à 14:28
szambaux
Messages postés56Date d'inscriptionmercredi 5 septembre 2007StatutMembreDernière intervention22 juillet 2010
-
21 avril 2009 à 10:16
Bonjour,tout d'abord je tiens à remerciez tout les membres de se forum qui nous permette de progresser chaque jours.
J'ai réalisé une classe de champs texte qui redimensionne automatiquement la taille de la police en fonction de la taille du texte, mais avec cette classe, j'ai des raté parfois (police beaucoup trop grande...)et je ne sais pas du tout pourquoi
package org.bytearray.texte
{
import flash.text.TextField;
import flash.text.TextFormat;
import flash.events.*;
public class ChampTexteAutoAdaptable extends TextField
{
private var adaptation:Boolean;
private var formatage:TextFormat;
private var tailleInitiale:int;
private var monTexte:String;
private var Width:Number;
public function ChampTexteAutoAdaptable ()
{
addEventListener(Event.RESIZE,resize);
}
public function set autoAdaptation ( pAdaptation:Boolean ):void
{
adaptation = pAdaptation;
}
public function get autoAdaptation ():Boolean
{
return adaptation;
}
public override function set text ( pText:String ):void
{
monTexte=pText;
super.border=true;
super.text = monTexte;
super.wordWrap = true;
super.multiline = true;
super.selectable=false;
if ( autoAdaptation ) adapte();
}
public function resize(e:Event)
{
if ( autoAdaptation ) adapte();
}
private function adapte ():void
{
formatage = getTextFormat();
tailleInitiale = int(formatage.size);
Width=width-0.05*width;
var Height:Number=height-0.05*height;
formatage.align ="center";
var i:Number=0
while ( (textWidth < Width || textHeight < Height) && i<1000 )
{
formatage.size = ++tailleInitiale+i;
setTextFormat ( formatage );
super.autoSize="center";
i++;
}
while ( textWidth > Width || textHeight > Height )
{
if ( formatage.size <= 0 ) return;
formatage.size = --tailleInitiale;
setTextFormat ( formatage );
super.autoSize="center";
}
var texte_array:Array=text.split(" ");
//on test si chaque entre en entier sur la ligne sans etre coupé
if( texte_array.length>0)
{
for each (var mot:String in texte_array)
{
super.text=mot;
setTextFormat ( formatage );
var tailleMini:Number=Number(formatage.size)/4;
while ( textWidth > Width-0.1*Width)
{
if ( formatage.size <= tailleMini ) return;
formatage.size=--tailleInitiale;
setTextFormat ( formatage );
}
}
}
super.text = monTexte;
setTextFormat ( formatage );
if(Width>width)
x=x+(Width-width)/2;
else
x=x+(width-Width)/2;
if(Height>height)
y=y+(Height-height)/2
else
y=y+(height-Height)/2
}
}
}
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 17 avril 2009 à 14:43
Bonjour,
Le problème c'est que tu viens demander sur ce forum des explications relatives à une classe dont on ne sait rien et même pas d'où elle vient ni ce qu'elle fait.
Je pense que le mieux serait de poser la question à l'endroit d'où vient cette classe ...
nickydaquick
Messages postés416Date d'inscriptionvendredi 31 janvier 2003StatutMembreDernière intervention19 décembre 20133 20 avril 2009 à 20:26
Salut,
premierement ta classe resize, et l'evenement RESIZE je m'en passerai a ta place. Une idee serait de surcharger les fonctions width et height (proprietes). Voici un exemple
override public function get width():Number {return __internalWidth;}
overrride public function set width(w:Number):void
{
setSize(w,__internalHeight);
}
override public function get height():Number {return __internalHeight;}
overrride public function set height(h:Number):void
{
setSize(__internalWidth,h);
}
et ensuite de definir la fonction setSize;
public function setSize(w:Number, h:Number):void
{ scaleX scaleY 1.0;
if(!isNaN(w))__internalWidth = w;
if(!isNaN(h))__internalHeight = h;
//completer le code ici
}
tu peux donc maintenant resizer ton objet avec les methodes object.width 45.0, object.height 15.2 (par exemple).
cela fonctionne aussi pour un composant, lorsqu'il est redimensionne sur le Stage (en gardant le nom de la fonction setSize intact).
pour ce qui est du calcul de la taille de la police, uneidee serait de definir le nombre de lignes visibles par hauteur de zone de texte: par exemple tu voudrais avoir 10 lignes visibles dans une zone de texte de 170.0 (donc une hauteur d'environ 17.0 par ligne ce qui donne une police de 11-12 avec une police verdana ), la taille de la police se calcule donc par
var taille:Number = (__field.height*11.0)/(170.0) ; //11 etant la taille pour une police verdana pour afficher 10 lignes sur 170.0 de hauteur.
Pour mettre a jour l'information, recupere le texte ,applique le format, puis remet le texte:
var s:String __field.text, format:TextFormat __field.defautlTextFormat;
if(format==null)format = new TextFormat;
format.size = taille;
szambaux
Messages postés56Date d'inscriptionmercredi 5 septembre 2007StatutMembreDernière intervention22 juillet 2010 21 avril 2009 à 10:16
Merci de votre réponse, j'ai vraiment du mal à me dire ce que je peux figer, car le but de cette classe est d'avoir l'écriture la plus grosse possible par rapport à la taille du champs texte, donc cela me parait vraiment difficile de connaitre le nombre de ligne dés le début vu que je ne connait pas la taille de la police finale. Cette classe est utilisé pour des textes pas trés long, souvent pour un bouton, ou une aide pour l'utilisateur.Sinon j'avais penser créer mon texte dans un sprite puis resizer le sprite à la taille voulu,mais je ne vois pas comment l'implementer à cause du saut de ligne