AIR for Android・iOS で、ASからソフトウェアキーボードを扱う
ActionScript のリファレンス で公開されていますが、AIR 2.6 (Flash Player 10.2) からは
Android・iOS のソフトウェアキーボード関連の API が追加されています。
needsSoftKeyboard など、使いそうなものをピックアップしてみます。
field.needsSoftKeyboard = true;
stage.focus = field;
needsSoftKeyboard プロパティは、TextField にフォーカスが当たったときに、
ソフトウェアキーボードを呼び出します。
AIR for iOS では、TextField にフォーカスが当たれば自動でソフトウェアキーボードが出てきますが、
AIR for Android では自動ではソフトウェアキーボードは出てきません。
(ハードウェアキーボード付の機種があるからかな?)
field.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, activated);
SOFT_KEYBOARD_ACTIVATE イベント はソフトウェアキーボードが起動したときに発火します。
予測変換領域などで、キーボードのサイズが変わるたびに発火するので注意。
field.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, deactivated);
SOFT_KEYBOARD_DEACTIVATE イベント はソフトウェアキーボードが閉じられたときに発火します。
TextField からフォーカスが外れると、キーボードが閉じられて、このイベントが発火します。
Android の BACK ボタンを押したり、ソフトウェアキーボード上の閉じるボタンを押した場合も、
このイベントが発火します。(Input Method によって、閉じるボタンがない場合も多い)
field.requestSoftKeyboard();
requestSoftKeyboard() メソッド は、その TextField でソフトウェアキーボードを呼び出します。
needsSoftKeyboard との使い分け方法は、分かりません。TMTOWTDI か。
var rect:Rectangle = stage.softKeyboardRect;
softKeyboardRect プロパティ は、ソフトウェアキーボードが占める画面領域を返します。
iOS では、ソフトウェアキーボードのサイズは 最低限のルール(参照) で判定できますが、
Android はソフトウェアキーボードのサイズが不定で、Input Method ごとに
バラバラです。画面内に綺麗に情報を配置するには、この情報が重要になります。
(現行の Packager for iPhone は AIR 2.0 ベースなので、この機能は使えません)
softKeyboardRect で、バグらしき動作を2つ見つけています。
Adobe にはレポート済み。直るかな。ご注意ください。
(1)
iPhone 4(Retina ディスプレイ利用時)に、softKeyboardRect が実際の
ソフトウェアキーボードの大きさの半分の値を返す。
→ workaround: Rectangle の全ての値を倍にすると、正しい値になります。
(2)
Android で、renderMode=gpu だと、
(x=0, y=322, w=480, h=440) のような固定値を返します。
ステージの大きさによって値が異なものの、キーボードの実際の大きさよりだいぶ広い。
→ workaround: 当面、renderMode=auto でパブリッシュする。
これらの API を利用したサンプルコードです。
中心の青いボタンを押すと、非表示だった TextField が登場して、
フォーカスがあたり、ソフトウェアキーボードも登場します。
TextField 以外をタップすると、フォーカスが外れて、
TextField が消えるのと同時にソフトウェアキーボードも消えます。
Android・iOS のソフトウェアキーボード関連の API が追加されています。
needsSoftKeyboard など、使いそうなものをピックアップしてみます。
field.needsSoftKeyboard = true;
stage.focus = field;
needsSoftKeyboard プロパティは、TextField にフォーカスが当たったときに、
ソフトウェアキーボードを呼び出します。
AIR for iOS では、TextField にフォーカスが当たれば自動でソフトウェアキーボードが出てきますが、
AIR for Android では自動ではソフトウェアキーボードは出てきません。
(ハードウェアキーボード付の機種があるからかな?)
field.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, activated);
SOFT_KEYBOARD_ACTIVATE イベント はソフトウェアキーボードが起動したときに発火します。
予測変換領域などで、キーボードのサイズが変わるたびに発火するので注意。
field.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, deactivated);
SOFT_KEYBOARD_DEACTIVATE イベント はソフトウェアキーボードが閉じられたときに発火します。
TextField からフォーカスが外れると、キーボードが閉じられて、このイベントが発火します。
Android の BACK ボタンを押したり、ソフトウェアキーボード上の閉じるボタンを押した場合も、
このイベントが発火します。(Input Method によって、閉じるボタンがない場合も多い)
field.requestSoftKeyboard();
requestSoftKeyboard() メソッド は、その TextField でソフトウェアキーボードを呼び出します。
needsSoftKeyboard との使い分け方法は、分かりません。TMTOWTDI か。
var rect:Rectangle = stage.softKeyboardRect;
softKeyboardRect プロパティ は、ソフトウェアキーボードが占める画面領域を返します。
iOS では、ソフトウェアキーボードのサイズは 最低限のルール(参照) で判定できますが、
Android はソフトウェアキーボードのサイズが不定で、Input Method ごとに
バラバラです。画面内に綺麗に情報を配置するには、この情報が重要になります。
(現行の Packager for iPhone は AIR 2.0 ベースなので、この機能は使えません)
バグ(2011.03.07 追記)
softKeyboardRect で、バグらしき動作を2つ見つけています。
Adobe にはレポート済み。直るかな。ご注意ください。
(1)
iPhone 4(Retina ディスプレイ利用時)に、softKeyboardRect が実際の
ソフトウェアキーボードの大きさの半分の値を返す。
→ workaround: Rectangle の全ての値を倍にすると、正しい値になります。
(2)
Android で、renderMode=gpu だと、
(x=0, y=322, w=480, h=440) のような固定値を返します。
ステージの大きさによって値が異なものの、キーボードの実際の大きさよりだいぶ広い。
→ workaround: 当面、renderMode=auto でパブリッシュする。
サンプルコード Softkey.as
これらの API を利用したサンプルコードです。
中心の青いボタンを押すと、非表示だった TextField が登場して、
フォーカスがあたり、ソフトウェアキーボードも登場します。
TextField 以外をタップすると、フォーカスが外れて、
TextField が消えるのと同時にソフトウェアキーボードも消えます。
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.SoftKeyboardEvent;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.utils.setTimeout;
public class Softkey extends MovieClip
{
private var mess:TextField;
private var field:TextField;
public function Softkey():void
{
addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(event:Event):void
{
stage.quality = StageQuality.LOW;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var format:TextFormat = new TextFormat();
format.size = 32;
format.font = '_sans';
mess = new TextField();
mess.type = TextFieldType.DYNAMIC;
mess.width = 480;
mess.height = 40;
mess.defaultTextFormat = format;
addChild(mess);
field = new TextField();
field.type = TextFieldType.INPUT;
field.width = 480;
field.height = 240;
field.multiline = true;
field.wordWrap = true;
field.defaultTextFormat = format;
field.text = 'Hello, SoftKeyboard!';
field.border = true;
field.borderColor = 0x336699;
field.needsSoftKeyboard = true;
field.y = 40;
addChild(field);
field.visible = false;
var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0x336699);
sprite.graphics.drawCircle(240, 400, 80);
sprite.graphics.endFill();
addChild(sprite);
sprite.addEventListener(MouseEvent.CLICK, clicked);
field.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_ACTIVATE, activated);
field.addEventListener(SoftKeyboardEvent.SOFT_KEYBOARD_DEACTIVATE, deactivated);
}
private function clicked(event:Event):void
{
field.visible = true;
stage.focus = field;
field.requestSoftKeyboard();
}
private function activated(event:Event):void
{
var rect:Rectangle = stage.softKeyboardRect;
mess.text = rect.toString();
}
private function deactivated(event:Event):void
{
stage.focus = null;
field.visible = false;
}
}
}
この記事へのコメント