Titanium Mobileで作る! iPhone/Androidアプリ

第8回 加速センサの使用と実機への転送

この記事を読むのに必要な時間:およそ 3 分

最新のニュースから

前回の記事が掲載された直後に,Appcelerator社からTitanium 1.6.0 がリリースされました。Android版での改良が多いのですが,iPhone向けにはUIのデザインをロジックのコードがから分離できるJSSのサポートや,音声処理や位置情報取得をバックグラウンドで行う機能がサポートされるようになりました。1.5.1のリリースが昨年末でしたので相変わらず速いスピードで開発が進んでいるのが伺えます。

さて,今回もスマートフォンならではの機能ということで,加速度センサに関係するAPIをご紹介します。

ジェスチャーの取得

まずは,直接加速度センサの値をとるのではなく,ジェスチャの取得による操作を説明します。iPhoneではデバイスを持って,左右にすこし強めに振ると実行中の処理をキャンセルできるように実装されているアプリが多数あります。標準のMMSアプリなどもメッセージを書いている途中で,このシェイクと呼ばれるジェスチャをするとメッセージの編集をキャンセルするか確認するダイアログが現れます。

画像

この機能を,いままで作ってきた,Twitterクライアントにも実装してみます。message_window.jsに次のコードを追加します。

Titanium.Gesture.addEventListener(
    'shake',
    function(){
        var alertDialog = Titanium.UI.createAlertDialog(
            {
                title: '入力をキャンセルしますか?',
                buttonNames: ['入力をキャンセル', '編集を続行'],
            }
        );
        alertDialog.addEventListener(
            'click',
            function(e) {
                if (e.index == 0) {
                    win.close();
                }
            }
        );
        alertDialog.show();
    }
);

ジェスチャが行われた時の処理は,Titanium.GestureオブジェクトのaddEventListenerメソッドで 'shake' イベントにイベントリスナを登録することで行います。上の例では,alertDialogを作成し,ユーザーに入力をキャンセルするか確認しています。いままでalert()という簡単なメソッドでアラートメッセージを表示していましたが,ボタンを複数用意したり,ボタンが押されたときの処理を登録する場合は上記のTitanium.UI.createAlertDialogを利用してアラートを作成します。使い方は前回解説したOptionDialogとほとんど同じです。

これで,投稿キャンセルがジェスチャでもできるようになりました。ぜひ実機で試していただきたいところですが,シミュレータの場合でもメニューの「Hardware」⁠⁠Shake Gesture」を選ぶことでシェイクジェスチャをシミュレートすることができます。

また今回は利用しませんが,shakeの代わりに 'orientationchange' イベントに対してイベントリスナを登録すれば,画面の向きが縦向きや横向きになったというイベントも取得できます。

加速度センサの値を取得する

さて,今度は加速度センサの値を直接取得してみましょう。加速度センサの値はx, y, z軸の値がとれます。加速度の値とiPhoneの姿勢の対応は,次のサイトで分かりやすく図示されています。

さて,Twitterとの連携はすこし無理やりですが,誰かがiPhoneを勝手に触ったときにツイートされるような仕組みを考えます。普段,iPhoneの画面を上にして平らなところにおいておくと,加速度の値はz軸がほぼ-1.0を指しています。重力加速度の値です。もし誰かがiPhoneを持ち上げて触ろうとすると,持ち上げたときの加速度でこの値が-1.0より小さくなります。裏表を考えなくても済むように,また観測値に誤差があることも考慮して,絶対値が1.1より大きくなったときにツイートされるようなコードにしてみましょう。

function postByAccelerometer(e) {
    if ( Math.abs(e.z) > 1.1 ) {
        accEnabled = false;            
        Ti.Accelerometer.removeEventListener('update',postByAccelerometer);
        tweet('iPhoneに触られた!');
    }
}

var accEnabled = false;
var accButton = Ti.UI.createButton(
    {
        top: 160,
        left: 190,
        width: 44,
        height: 44,
        title: 'Acc'
    }
);
accButton.addEventListener(
    'click',
    function () {
        if (accEnabled) {
            alert('無効にします');
            accEnabled = false;            
            Ti.Accelerometer.removeEventListener('update',postByAccelerometer);
        } else {
            alert('有効にします');
            accEnabled = true;
            Ti.Accelerometer.addEventListener('update',postByAccelerometer);
        }
    }
);
win.add(accButton);

加速度センサの値を取るには,Titanium.AccelerometerオブジェクトのaddEventListenerメソッドを使って,'update' イベントにイベントリスナを設定します。イベントリスナが設定されている間はずっと加速度センサの値が取られるので,センサの値が必要なくなった時にはイベントリスナを削除する必要があります。イベントリスナにわたってくるイベントオブジェクトeには,x, y, z軸の加速度がそれぞれ,e.z, e.y, e.zで取得できるようになっています。

上の例では,まずボタン(accButton)を作成し,そのボタンがクリックさたときのコールバック関数のなかで,イベントリスナの設定と削除を行っています。

Ti.Accelerometer.addEventListenerの第二引数で無名関数を渡すのではなく,先に定義しているpostByAccelerometerを渡している点にも注意してください。これはイベントリスナを削除するremoveEventListenrを呼び出すときにaddEventListenerで使ったものと同じイベント名と関数オブジェクトを必要とするためです。

これで,Accと書かれたボタンを一度押した状態でiPhoneを持ち上げると勝手にツイートが行われるはずです。もしかするとiPhoneの動かし方などによると上手く動作しないかもしれません。このように加速度センサの値はそのまま使うのはなかなか難しく工夫が必要です。

実機にインストールするには

さて,この加速度センサを利用したアプリを動かすには実機にインストールして試すほかありません。実機でiPhoneアプリを動かすにはiOS Developer Porigramに参加する必要があります。これは年会費が1年に1万円程度必要となります。

iOS Developer Programに入会したら,目指せ!iPhoneアプリ開発エキスパート「第9回 デバイスでアプリを動かす」を参考に,Provisioningファイルを作成してください。作成するときに,Provisioning Portalで作成するAppIDとTitaniumで設定しているApplication IDが同じになるようにしてください。作成するまでに色々と手順が必要なので,始めての方は,前掲の記事を通して読んでおくことをおすすめします。

取得したProvisioning Profileを「Run on Device」タブで設定します。

設定が終わったらUSBケーブルでiPhoneを接続した後に,⁠Install Now」ボタンを押してインストールを開始します。

この画面で,Provisioning Profile の設定とインストールを行います

画像

この時,Titaniumアプリ右上のメッセージボックスが変化するだけで,かなり長い時間ビルドに待たされます。上手く動いているか不安になりますが気長に待ちましょう。また,Provisioningの設定が悪いと,ビルドの途中でエラーがでて止まることがあります。

もしビルドが止まってしまったら次のことに注意してみてください。

  • iPhoneのiOSバージョンとSDKのバージョンは合っているか
    • SDKのバージョンが古いとインストールできません
    • iPhoneのバージョンだけが古い場合はうまく行くことがあります
  • Provisionig ProfileのAppIDとTitanium側のApplication IDはあっているか

無事ビルドが終わると,まずはiTunesのアプリ一覧に作成したアプリが現れます。この時USBケーブルでiPhoneがきちんと繋がっていれば自動的にsyncが始まりビルドしたアプリがiPhoneに転送されます。

まとめ

今回はジェスチャと加速度センサの取得方法について解説しました。また加速度センサをつかうのに必要な実機へのインストール方法についても簡単に説明しました。実機インストールはなにかと失敗することが多いのですが,上記の注意事項などを参考に根気強く試してみてください。

著者プロフィール

倉井龍太郎(くらいりゅうたろう)

株式会社はてな アプリケーションエンジニア。

スマートフォンアプリからSQLチューニングまで幅広く格闘中。好きな言語はRuby。

URLhttp://d.hatena.ne.jp/r_kurain/
Twitter@kurain

コメント

コメントの記入