矩形をドラッグするサンプル。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"が格納されるので、そのときにもフォーカスを外すようにしています。