Kawanet Blog II

アクセスカウンタ

zoom RSS AIR for Android・iOS で、ASからソフトウェアキーボードを扱う

<<   作成日時 : 2011/03/04 01:06   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 0 / コメント 0

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 ベースなので、この機能は使えません)

バグ(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;
    }
  }
}



FlashクリエイターのためのAIRプログラミング入門
ビー・エヌ・エヌ新社
大津 真

amazon.co.jpで買う
Amazonアソシエイト by FlashクリエイターのためのAIRプログラミング入門 の詳しい情報を見る / ウェブリブログ商品ポータル


テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 1
なるほど(納得、参考になった、ヘー)

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
AIR for Android・iOS で、ASからソフトウェアキーボードを扱う Kawanet Blog II/BIGLOBEウェブリブログ
文字サイズ:       閉じる