先日リリースした「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で開発したアプリ)のような動作が可能になります。

