我有HorizontalFieldManager
, VerticalFieldManager
和LabelField
。LabelField
放在HorizontalFieldManager
中,多个HorizontalFieldManager
放在VerticalFieldManager
中。
当我尝试使用LabelField . getheight()获取LabelField高度时;它返回0。如果在Labelfield中有多条线,它也会给我高度返回0。HorizontalFieldManager
也面临同样的问题。
到达高度后,我想计算VerticalFieldManager
的高度,并动态设置屏幕的高度。
我如何计算标签或Horizontalfieldmanager的高度?
使用labelField.getPreferredHeight()
和manager.getPreferredHeight()
而不是labelField.getHeight()
Farid方法建议使用它有点困难,因为您将需要labelWidth。对于多行标签,这个labelWidth可能与父管理器的可用宽度不同,或者是你设置的一些确切的宽度,因为每一行都可以有不同的宽度,这取决于单词是否适合maxWidth。
注意:正如Nate在评论中指出的那样,为空格添加advance也是一个好主意。我修改了代码来包含它。
下面是我用来克服这些问题的方法:
public int getPreferredHeight() {
String text = getText();
int maxWidth = getManager().getPreferredWidth();
int spaceAdvance = getFont().getAdvance(' ');
String[] words = StringUtilities.stringToWords(text);
int lastWordAdvance = 0;
int lines = 1;
for (int i = 0; i < words.length; i++) {
int wordAdvance = getFont().getAdvance(words[i]) + spaceAdvance;
if (lastWordAdvance + wordAdvance < maxWidth ) {
lastWordAdvance += wordAdvance;
} else {
lines++;
lastWordAdvance = wordAdvance;
}
}
return (int)lines * getFont().getHeight();
}
如果您可以在布局之后再决定LabelField的大小,那么您将从getHeight()中准确地获得它。这意味着您实际上可以得到正确的结果,包括考虑LabelField的任何空白或填充,我认为
int maxWidth = getManager().getPreferredWidth();
将小姐。
一开始这似乎很困难,因为当您向屏幕添加字段时,通常最好知道高度。但一般的原则是你应该在管理器的子布局中这样做,所以你只是移动依赖于高度的代码,在这个过程的后期。这样做的好处是布局是动态的,所以如果LabelField的文本被改变,那么布局将被调用,而依赖于高度的代码也会被重新调用。
也可以在sublayout()中使用这样的逻辑:
super.sublayout(...);
if (myField.getHeight() < 100 ) {
myField.setMargin((100 - myField.getHeight())/2, 0, (100 - myField.getHeight())/2, 0);
super.sublayout(...);
}
这不是一个适合制作的例子,不建议硬编码像素高度。这只是一个容易理解的例子....