이벤트, 리스너는 어떤 행위(이벤트) 가 일어났을 때 이를 감지(리스너) 하고 이에 대해 특정 행위를 하도록 하는 상호 작용 효과를 내는데 꼭 필요한 기능입니다.
글로벌 이벤트(Global Events)
어떤 이벤트 들은 광범위하게 적용 되는 겁니다. 예를 들어 enterFrame, system, orientatin등이 있습니다. 이미지,버튼,텍스트 같이 특정 객체(object)에 한정된 이벤트가 아니라 프로그램 전체적으로 영향이 있는 글로벌 이벤트 입니다.
local label = display.newText( "portrait", 0, 0, nil, 30 )
label:setTextColor( 255,255,255 )
label.x = display.stageWidth/2; label.y = display.stageHeight/2
local function onOrientationChange( event )
label.text = event.type -- change text to reflect current orientation
-- rotate text so it remains upright
local newAngle = label.rotation - event.delta
transition.to( label, { time=150, rotation=newAngle } )
end
Runtime:addEventListener( "orientation", onOrientationChange )
위 소스 코드는 orientation 의 변화가 있으면 onOrientationChange 함수를 실행합니다.
핸드폰이 세워저 있으면 portrait 글자가 쓰여지고 옆으로 뉘어져 있으면 글자도 각도를 바꾸고 text도 바뀌는 함수 입니다.
orientationr과 관련된 cases는 상하좌우로 돌릴때랑 faceUp,faceDown 이렇게 6개가 있네요.
Local Events
Hit Events - user가 스크린을 터치 하면 이 히트 이벤트가 생깁니다. 만약에 이 이벤트를 어떤 특정 객체(object)에 줬다면 이 hit 포인트의 좌표를 그 object가 가로 채서 사용하게 될 겁니다.
이벤트의 전달(전파)와 핸들링 (Propagation/Handling)
이 이벤트들은 특정한 순서에 따른 객체(objects)들을 통해 전파 됩니다. 디폴트로는 이벤트를 받기 위한 display hierarchy에 따른 첫번째 object가 그 이벤트를 갖게 될 겁니다. 쉽게말하면 일반적으로 가장 위에 display된 객체가 우선적으로 이벤트를 가로 채 가게 될 거라는 겁니다. 이 이벤트는 그 이벤트가 핸들(처리) 될 때까지 전파(전달) 될 겁니다. 그러니까 한 위치에 여러개의 객체(object)가 중복 돼 있고 그 위치를 hit 했다면 맨 위의 객체에게 전달 되고 그 객체가 핸들링을 하지 않으면 그 다음객체 또 핸들되지 않으면 그 다음 객체 ... 이런 순으로 이벤트가 각 객체들에 전달되고 맨 마지막에는 스크린 자체 객체(Runtime object)에 전달 될 겁니다.
만약에 겹쳐진 두개의 객체에서 핸들링 하도록 되 있다면 우선순위에 있는 객체에 이벤트가 전달되고 핸들링 되면 이 이벤트의 전달(전파)는 끝이 날 것이기 때문에 우선순위에 밀린 객체는 그 이벤트를 핸들링 할 수 없게 됩니다.
Overriding Propagation with Focus
Focus를 세팅함으로서 특정 오프젝트에 앞으로의 hit 이벤트를 redirect할 수 있습니다. 예를 들어 버튼을 터치 하면 다른 버튼 이미지로 바뀌도록 했을 경우를 상상해 보면, down 하면 이미지가 바뀌고 up 하면 원래 이미지로 돌아와야 되는데 user가 down한 후 up을 하지 않고 버튼 밖으로 나가서 up을 하게 되면 원래 이미지로 돌아오지를 못 합니다. 이 경우 앞으로 일어날 up이벤트를 이 버튼에 포커스를 맞추겠다는 의미로 이 setFocus 를 이용하면 어디에서 up을 하든지 이 버튼의 토글 기능은 제대로 작동 할 겁니다.
function button:touch( event )
local phase = event.phase
if "began" == phase then
-- Subsequent touch events will target button even if they are
-- outside the stageBounds of button
display.getCurrentStage():setFocus( self )
else
...
end
return true
end
Listener and Event Delivery
리스너는 함수이거나 테이블 객체 일 수 있습니다. 두 경우 모두 event 인수가 리스너에 전달 됩니다.
함수 리스너(function Listener)
local function listener( event )
print("Call #"..event.count )
end
timer.performWithDelay(1000, listener, 5 )
테이블 리스너(Table Listener)
local listener = {}
function listener:timer( event )
print("Call #"..event.count )
end
timer.performWithDelay(1000, listener, 5 )
위 소스코드는 timer 이벤트에서 listener라는 함수를 호출하고 있습니다.
위에것은 함수 리스너이고 아래것은 테이블 리스너 입니다.
Registering for Events
이벤트는 addEventListener라는 메소드를 통해서 등록합니다. 그리고 removeEventListener라는 메소드로 제거합니다.
• object:addEventListener( )
• object:removeEventListener( )
* Function Listener
local button = display.newImage("button.png")
local function listener(event)
print(event.name.."occurred")
return true
end
button:addEventListener( "touch", listener )
* Table Listener
local button = display.newImage("button.png")
function button:touch(event)
print(event.name.."occurred")
return true
end
button:addEventListener( "touch", button )
위 두 소스 코드는 버튼 이미지에 이벤트리스너를 단 것입니다. 위에것은 함수 리스너이고 아래 것은 테이블 리스너 입니다.
객체가 아니라 시스템에 add하는 이벤트리스너는 아래와 같이 add합니다.
* Function Listener
local function listener(event)
print(event.name.."occurred")
end
Runtime:addEventListener("enterFrame", listener )
* Table Listener
local listener = {}
function listener:enterFrame(event)
print(event.name.."occurred")
end
Runtime:addEventListener("enterFrame", listener )
이제 이벤트 다는 법을 배웠습니다.
그런데 Function Listener와 Table Listener가 나오는데 두개의 차이점과 장단점이 무엇인지 궁금하지 않나요?
두 리스너의 차이점과 장단점에 대해서는 다음 글에서 다루겠습니다.
다음 글에서는 이 외에 이벤트의 종류와 timer에 대해서도 배워보겠습니다.
'Corona SDK > Corona Doc' 카테고리의 다른 글
Corona SDK 프로그래밍 테크닉 1 (1) | 2011.11.08 |
---|---|
Corona SDK Native UI (0) | 2011.11.07 |
Location and Maps (0) | 2011.11.04 |
이벤트, 리스너로 다이나믹한 표현 하기 3 (4) | 2011.11.03 |
이벤트, 리스너로 다이나믹한 표현 하기 2 (4) | 2011.11.02 |
System과 OS Library (5) | 2011.10.31 |
코로나 네트워킹 과 웹 서비스 3 (In App Purchase 1) (2) | 2011.10.25 |
코로나 네트워킹 과 웹 서비스 2 (0) | 2011.10.24 |
코로나 네트워킹 과 웹 서비스 1 (0) | 2011.10.21 |
오디오, 비디오, 사진 컨트롤 2 (4) | 2011.10.20 |