ActionScript 3 Распространение текстовых полей - PullRequest
0 голосов
/ 17 декабря 2009

Actionscript 3

Сегодня я больше всего ломал голову над лучшим способом решения этой проблемы, но в итоге я усложняю то, что считаю простой задачей.

У меня есть несколько текстовых полей, расположенных рядом друг с другом на всю фиксированную ширину, т.е. ([ширина])

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

То, что я хочу сделать, это иметь возможность выбрать, какую деталь я хочу показать, а затем перераспределить ширину удаленного TextField на остальные (обратите внимание, что вы можете удалить только справа), поэтому, если я должен был показать для "tf3" 120 (70 + 50) должно быть равномерно распределено на другие блоки:

[      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]

Затем выровняйте их снова (x + ширина и т. Д.):

 [      133.3       ][     83.3      ][     83.3     ]

Любые идеи о лучшем методе, я уверен, что есть несколько хороших простых функций, которые я могу использовать для этого.

Я, наверное, слишком усложнил вопрос и сейчас, но попробую, у кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 17 декабря 2009

Итак, позвольте мне получить это прямо, у вас есть N текстовых полей различной ширины, и вы хотите удалить 1 или более из них, переставить оставшиеся M текстовых полей, перераспределить их ширину пропорционально (т.е. если текстовое поле T 1 была вдвое больше ширины текстового поля T 2 , все равно будет после перестановки)?

На самом деле это не очень простая проблема, но ниже я остановился на ней. Вы передаете ему массив ваших текстовых полей (слева направо), число, которое вы хотите сохранить, и необязательное смещение по оси X.

Примечание: Я не делал AS3 в течение нескольких месяцев, поэтому рассмотрим ниже псевдокод - вам придется отредактировать его, чтобы он работал.

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;
  }  
}

Примечание: Этот код не удаляет текстовые поля "unkept" из вида; вам придется добавить это или сделать это в другом месте.

1 голос
/ 17 декабря 2009

Я что-то неправильно понимаю или не так просто, как:

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