动作脚本3
今天我一直在以最好的方式破坏我的头脑,但我最终会使我认为简单的任务变得复杂。
我有一些TextFields彼此相邻排列所有固定宽度,即([width])
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 ]
任何更好方法的想法,我确定有一些很好的简单函数可以用来做到这一点。
我现在也可能过于复杂化了这个问题,但不好试一试,有人有什么想法吗?
答案 0 :(得分:1)
我是否误解了某些东西,或者它不会像以下那样简单:
boxWidth = (availableWidth - (padding + margins)) / numberOfFieldsShown
答案 1 :(得分:1)
所以,让我直截了当,你有N个不同宽度的文本字段,你想删除其中的一个或多个,重新排列剩余的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”文本字段;你必须添加或在其他地方添加它。