无法找到previous problem的解决方案,我决定使用自定义布局实现自己的软键盘。我想要为键盘做的是能够顺利地适应各种不同的屏幕尺寸。因此,当键与屏幕的边界重叠时,整条线都会分开并整齐定位。
一切都按计划进行。我重写了updateDisplayList()
以重新定位元素
和measure()
以确定正确的尺寸,因此当我们在垂直组中定位时,我的布局会相应地拉伸它。
我在平板电脑上安装应用程序时会出现问题。定位都错了。尺寸看起来应该是应有的三倍。
我在 SANSUI ETAB 801VP (AIR 3.6.0.585,Android 4.0.4)上测试应用
以下是定位代码:
override public function updateDisplayList(width : Number, height : Number):void
{
var x : Number = 0, y : Number = 0;
for (var i : uint = 0; i < target.numElements; i++) {
var element : ILayoutElement = target.getElementAt(i);
element.setLayoutBoundsSize(NaN, NaN);
var dx : Number = x + element.getLayoutBoundsWidth() + _gap;
if (dx >= target.parent.width) {
i = Math.floor(i / 2);
x = dx = 0;
y += getMaxHeight(0, i) + _gap;
}
element.setLayoutBoundsPosition(x, y);
x = dx;
}
}
测量:
override public function measure():void
{
var indent : Number = 0, height : Number = 0;
var next : uint = 0;
for (var i : uint = 0; i < target.numElements; i++) {
var element : ILayoutElement = target.getElementAt(i);
element.setLayoutBoundsSize(NaN, NaN);
var dx : Number = indent + element.getLayoutBoundsWidth() + _gap;
if (dx >= target.parent.width) {
height += getMaxHeight(next, i) + _gap;
next = 0;
}
indent = dx;
}
height += height == 0
? getMaxHeight()
: getMaxHeight(next);
target.measuredWidth = target.parent.width;
target.measuredHeight = height;
}
getMaxHeight()
迭代指定范围的元素,计算最大高度:
private function getMaxHeight(startIndex : uint = 0, endIndex : uint = 0x7fffffff):Number
{
endIndex = Math.min(target.numElements, endIndex);
var height : Number = 0;
for (var i : uint = 0; i < endIndex; i++) {
var element : IVisualElement = target.getElementAt(i);
element.setLayoutBoundsSize(NaN, NaN);
height = Math.max(element.height, height);
}
return height;
}
我在这里遗漏了什么吗?在我的FlashDevelop中,该平台设置为AIR Mobile 3.1。我是否应该尝试在计算机上安装AIR 3.6以满足我在平板电脑上获得的结果?