未能找到解决我之前问题的方法,我决定使用自定义布局实现我自己的软键盘。我想为键盘做的就是能够顺利地适应各种不同的屏幕尺寸。因此,当按键与屏幕边界重叠时,整条线被划分并整齐地定位。
一切都按计划进行。我重写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 以满足我在平板电脑上获得的结果?