1

未能找到解决我之前问题的方法,我决定使用自定义布局实现我自己的软键盘。我想为键盘做的就是能够顺利地适应各种不同的屏幕尺寸。因此,当按键与屏幕边界重叠时,整条线被划分并整齐地定位。

一切都按计划进行。我重写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 以满足我在平板电脑上获得的结果?

4

0 回答 0