1

以前の問題の解決策が見つからなかったため、カスタム レイアウトを使用して独自のソフト キーボードを実装することにしました。私がキーボードでやりたかったことは、さまざまな異なる画面サイズにスムーズに収まるようにすることです。そのため、キーが画面の境界に重なっている場合、行全体が分割されてきれいに配置されます。

すべてが計画通りに進みました。updateDisplayList()要素を再配置し、measure()正しいサイズを割り当てるようにオーバーライドしたため、垂直グループに配置すると、それに応じてレイアウトが引き伸ばされます。

タブレットにアプリをインストールしたときに問題が発生しました。ポジショニングはすべて間違っていました。サイズは本来あるべきものの 3 倍のように見えました。

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