2009-12-17 11 views
0

Actionscript 3ActionScript 3 Distributing TextFields

J'ai été Wrecking ma tête le plus aujourd'hui sur la meilleure façon d'aller à ce sujet, mais je finissent plus compliquer ce que je crois être une tâche simple.

J'ai quelques TextFields alignés côte à côte toute la largeur fixe, à savoir ([width])

 tf1   tf2  tf3  tf4  tf5 
[  80  ][ 50 ][ 50 ][ 50 ][ 70 ] 

Ce que je veux faire est de pouvoir sélectionner les détails que je veux montrer, puis redistribuez la largeur du TextField supprimé au reste (notez que vous ne pouvez retirer que de la droite), donc si je devais apparaître à "tf3", 120 (70 + 50) devrait être distribué uniformément aux autres cases:

[  80 + 50 + 50 = 180     ] 
      tf1 
[80/180*120 + 80 = 133.3] 
         tf2 
       [50/180*120 + 50 = 83.3] 
            tf3 
         [50/180*120 + 50 = 83.3] 

ligne, puis les à nouveau (x + largeur, etc.):

[  133.3  ][  83.3  ][  83.3  ] 

Toutes les idées d'une meilleure méthode, je suis sûr qu'il y a quelques bonnes fonctions faciles que je peux utiliser pour le faire.

J'ai probablement trop compliqué la question maintenant, mais mal essayer, quelqu'un a des idées?

Répondre

1

Alors, laissez-moi obtenir ce droit, vous avez N champs de texte de différentes largeurs et que vous souhaitez supprimer 1 ou plus d'entre eux, réorganisant les champs de texte M restants, redistribuant leurs largeurs proportionnellement (ie si le champ de texte T était deux fois plus large que le champ de texte T , il le serait encore après qu'ils soient réarrangés)?

Ce n'est pas vraiment un problème très simple, mais je l'ai essayé ci-dessous. Vous lui transmettez le tableau de vos champs de texte (de gauche à droite), le numéro que vous souhaitez conserver et un décalage X facultatif.

Note: Je n'ai pas fait AS3 depuis des mois alors considérez le ci-dessous pseudocode - vous devrez l'éditer pour le faire fonctionner.

function arrangeTextFields(textFields:Array, keep:int, xOffset:Number = 0) { 
    // we can't keep more fields than are provided 
    keep = Math.min(keep, textFields.length); 

    var totalWidth = 0, // the total width of all textfields 
     keptOrigWidth = 0, // the total combined widths of the ones you're keeping 
     origNum:int = textFields.length; 

    // calculate the above values by addition in a loop 
    // (because AS3 lacks an inject/reduce method) 
    for(var i:int, i++, i < origNum) { 
    totalWidth += textFields[i].width; 

    if(i < take) { 
     keptOrigWidth += textFields[i].width; 
    } 
    } 

    var ratio:Number = totalWidth/takenOrigWidth, // the ratio we'll resize each field by to keep them proportional 
     currentX:int = 0; 

    textFields = textFields.slice(0, keep - 1); // throw away the fields we're not keeping 

    for(int i = 0; i < take; i++) { 
    textFields[i].width = textFields[i].width * ratio; // resize it 
    textFields[i].x  = currentX + xOffset;   // move it 

    currentX += textFields[i].width; 
    } 
} 

Note: Ce code ne supprime pas réellement les champs de texte "de la vue" non tenues; vous devrez l'ajouter ou le faire ailleurs.

1

Suis-je quelque chose mal comprendre, ou ne serait-il être aussi simple que:

boxWidth = (availableWidth - (padding + margins))/numberOfFieldsShown