以前の問題の解決策が見つからなかったため、カスタム レイアウトを使用して独自のソフト キーボードを実装することにしました。私がキーボードでやりたかったことは、さまざまな異なる画面サイズにスムーズに収まるようにすることです。そのため、キーが画面の境界に重なっている場合、行全体が分割されてきれいに配置されます。
すべてが計画通りに進みました。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 をコンピューターにインストールする必要がありますか?