矩形をドラッグするサンプル。setFocusを使う。
矩形をドラッグするサンプル - noriok's diaryでは、矩形をドラッグするサンプルを作りました。ドラッグ中にマウスをいきおいよく動かし、マウスポインタが矩形の領域外に出てしまうと、イベントが矩形に伝達されず、矩形がその場で止まってしまう問題がありました。今回は、それを解消するプログラムを作成します。
マウスポインタが矩形の範囲外であっても、矩形にイベントを送信し続けるにはApp Development Tool | stage:setFocus( )を使います。
function onTouch(event) if event.phase == "began" then display.getCurrentStage():setFocus(event.target) -- フォーカスセット event.target.xStart = event.target.x event.target.yStart = event.target.y elseif event.phase == "ended" or event.phase == "cancelled" then display.getCurrentStage():setFocus(nil) -- フォーカスを外す end event.target.x = event.target.xStart + (event.x - event.xStart) event.target.y = event.target.yStart + (event.y - event.yStart) return true end function main() local x = display.contentWidth/2 local y = display.contentHeight/2 local size = 40 local rect = display.newRect(x-size/2, y-size/2, size, size) rect:setFillColor(255, 255, 255) rect:addEventListener("touch", onTouch) end main()
矩形がタッチされたとき、event.phaseに"began"が格納されています。そのときに矩形オブジェクトにフォーカスをセットしています。フォーカスをセットすると、それ以降のイベントが矩形オブジェクトに伝達され続けます。
display.getCurrentStage():setFocus(event.target) -- フォーカスセット
フォーカスを外すには、引数にnilを渡します。画面から指が離れたとき、event.phaseには"ended"が格納されますので、そのときにフォーカスを外すようにしています。
display.getCurrentStage():setFocus(nil) -- フォーカスを外す
システムがタッチイベントの追跡をキャンセルした場合には、event.phaseに"cancelled"が格納されるので、そのときにもフォーカスを外すようにしています。