Corona中文站

强大、易学的跨平台(iOS/Android)开发框架。QQ群1:74390406(满) 群2:221929599

导航

五分钟学会Corona(二十四) - 交互性和事件检测
事件是你创建交互程序的主要方式。它们是在你的程序中触发响应的一种方式。例如,你可以把任意display object放入一个交互按钮中。这种灵活性在Corona SDK中是最重要的东西。


全局事件

一些事件是广播的,例如“enterFrame”,“system”,“orientation”等。这些事件是全局的,因为它们不针对任何一个特定的对象。相反,它们广播给所有感兴趣的listener。下面这个来自“Orientation”例子的代码,它说明了你的应用程序如何响应定位改变:


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 )


本地事件

本地事件被发送给单独的listener,而不采用广播。


Hit事件

当用户的手指触摸到屏幕,一个hit事件会生成,并转发给显示层次中的显示对象。默认情况下,只有那些和触碰位置相交的对象(手指触摸到屏幕的位置)才会被分发这个事件。


传播和处理事件

事件在这些对象中传播遵循特定的顺序。默认情况下,显示层次中收到事件的第一个对象是最顶层的显示对象;下一个传递的对象是次顶层的对象,以此类推。(参与的对象就是和手指位置有交叉的对象)


Hit事件传递直到它被处理。你可以通过告诉系统事件已被处理,阻止事件继续传递给下一个对象(当前对象的所有listener还是可以得到事件)。这归结为让listener返回true即可。如果当前对象的listener中至少有一个返回true,事件传递终止。下一个对象将无法获得事件。如果这个事件在传递过程中一直都没得到处理,它将会作为一个全局事件广播给全局运行时对象。


Hit事件是一种本地和全局事件的杂交。他们一次被分发到一个单独的display object上,但是该对象的任何listener将会被分发这个事件,只要他注册了接收这个事件。



Overriding Propagation with Focus

你可通过设置焦点,来重定向hit事件到一个指定的display object。


考虑一个翻转按钮的情况。当用户按下了按钮,这个按钮以某种方式改变自己的外观,表明用户已经触摸到这个按钮。如果用户按下按钮之后(没有放开手指),并继续移动手指超出按钮,这个按钮应该改变回到自己原来的样子。


用默认的分发行为和hit事件传播规则,很难达到这个目的。如果一个作为翻转按钮的display object一开始被hit,我们将希望 直到用户把手指从屏幕上放开,事件才被传递过去。通过在display object上设置焦点可以达到这个目的,这要求系统提供未来的hit事件到display object上:


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



参看“Button”例子代码。


Listeners和事件转发

Listener可以是函数也可以是table(objects)。这两种情况,一个事件参数一直被传递给listener。每种事件保存着可用的不同属性。



Function Listener
Table Listener

local function listener( event )

print("Call #"..event.count )

end


timer.performWithDelay( 1000, listener, 5 )
local listener = {}

function listener:timer( event )

print("Call #"..event.count )

end


timer.performWithDelay( 1000, listener, 5 )



注册事件

我们使用 addEventListener对象方法来注册指向目标的事件。你传事件的字符串名给listener(function或table)来处理事件。通常listener将和 Basic Interactivity. 中的例子中的对象差不多。


转换

所有事件都有一个name属性,对应于你注册这个事件时取的名字。
<< 五分钟学会Corona(二十三) - OS Library五分钟学会Corona(二十五) - Event 和 Listener >>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 Copyright 2011-2015 BuildApp.Net. All Rights Reserved.