0

アクションスクリプト 3

私は今日、これを行う最善の方法について頭を悩ませてきましたが、単純な作業であると信じていたものを複雑にしすぎてしまいました。

私はいくつかの TextField を隣り合わせに並べて、すべて固定幅、つまり ( [ width ]) にしています。

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

私がやりたいことは、表示したい詳細を選択し、削除された TextField の幅を残りの部分に再分配できるようにすることです (右側からのみ削除できることに注意してください)。 ", 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     ]

より良い方法のアイデアがあれば、これを行うために使用できる便利で簡単な関数がいくつかあると確信しています。

私はおそらく今も質問を複雑にしすぎていますが、試してみてください。誰かアイデアはありますか?

4

2 に答える 2

1

つまり、幅の異なる N 個のテキスト フィールドがあり、そのうちの 1 つ以上を削除し、残りの M 個のテキスト フィールドを並べ替えて、それらの幅を比例的に再配分したい (つまり、テキスト フィールド T 1が幅の 2 倍だった場合)テキストフィールド 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;
  }  
}

注:このコードは、実際には「取得されていない」テキスト フィールドをビューから削除しません。それを追加するか、他の場所で行う必要があります。

于 2009-12-17T15:06:30.430 に答える
1

私は何かを誤解していますか、それとも次のように単純ではないでしょうか:

boxWidth = (availableWidth - (padding + margins)) / numberOfFieldsShown
于 2009-12-17T14:33:13.880 に答える