先日リリースした「Cutie Horoscope」でもAndroidではキー操作によって“戻る”と“メニュー画面を表示”を行っています。
※実際の動きは、アプリをDLして確認ください。
最初はアンスカのAPI解説ページを見て、取得したKEYイベントにあわせてdirector:changeScene()で画面遷移できるんだろうと思って、そのようなコードを書いてみたのですが、画面遷移のアニメーションが効かないという状況に。。。
あれ?
この時すでにライセンスを購入済みだったのでForumを検索してみると、あっ、あった!
「Android device back button utilizing Director class」というタイトルのトピックが立てられていました。
あー、色々と小細工的な処理が必要なようです。
※Forum見られる方はそちらへ。サンプルのソースが載ってます
下記に「Cutie Horoscope」のソースを抜粋して解説します。
new = function ( params ) --(略)-- local localGroup = display.newGroup() --ポイント1-- local backButtonPushed = false local menuButtonPushed = false --(略)-- --ポイント2-- local animate = function( event ) if backButtonPushed == true then backButtonPushed = false os.exit() elseif menuButtonPushed == true then menuButtonPushed = false director:changeScene( "setting", "overFromBottom" ) end end local onKeyEvent = function( event ) local phase = event.phase local keyName = event.keyName if phase == "up" and (keyName == "back") then backButtonPushed = true elseif phase == "up" and (keyName == "menu") then menuButtonPushed = true end return true end --(略)-- --ポイント3-- function clean ( event ) Runtime:removeEventListener( "key", onKeyEvent ) Runtime:removeEventListener( "enterFrame", animate ) backButtonPushed = nil menuButtonPushed = nil end local initVars = function () --(略)-- --ポイント2-- Runtime:addEventListener( "key", onKeyEvent ) Runtime:addEventListener( "enterFrame", animate ) --(略)-- end initVars() return localGroup end
ポイントは3つ
1.ボタンが押されたことを判別するフラグを用意する
2.enterFrameイベントでそのフラグを判定して遷移等の処理を行う。KEYイベントはどのキーが押されたか、フラグを書き換えるだけ
3.cleanメソッドでイベントリスナーとフラグの解除を行う
上記の様にしないと、遷移時のエフェクトが掛かりません。そして、イベントの解除等をしないと、最初に設定したイベントが有効のままになってしまうようで、Backキーを押した時に戻る画面が違って何故?ってことになります。
動かし方がわかれば、後はキーと遷移時のエフェクトの組み合わせをうまくやれば、ネイティブ・アプリ(Javaで開発したアプリ)のような動作が可能になります。