Adaptation automatique de la taille de la police

szambaux Messages postés 56 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 22 juillet 2010 - 17 avril 2009 à 14:28
szambaux Messages postés 56 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 22 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) &amp;&amp; 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
        
    } 
 } 
}

3 réponses

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
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 ...

Peg'
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
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;

__field.defaultTextFormat = format;
__field.text = s;

Bonne continuation

je suis heureux de faire partie d'une grande famille ...!

/B&
0
szambaux Messages postés 56 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 22 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
0
Rejoignez-nous