Corona SDK新手教程:tap、touch和multitouch的區別

本教程主要講解一下tap、touch和multitouch的區別,以及如何處理每種方式。html

若是是新手的話,能夠先複習一下以前的文章 CoronaSDK之交互系統和事件檢測app

1 Tap檢測函數

Tap事件是用戶和觸屏之間交互最基礎的一種。本質上來講,一個tap就是表示用戶用手指接觸到屏幕,而後在差很少附近的位置再擡起的過程。這個tap事件只有在用戶在同一個點接觸和放開屏幕,才做爲tap事件成功的發生。post

在Corona裏,對於大部分display object,你能夠註冊一個tap事件監聽器來監聽tap事件:測試

local function myTapListener( event )

    --code executed when the button is tapped
    print( "object tapped = "..tostring(event.target) )  --'event.target' is the tapped object
    return true
end

local myButton = display.newRect( 100, 100, 200, 50 )
myButton:addEventListener( "tap", myTapListener )  --add a "tap" listener to the object

 

來自tap事件的event參數包括下列字段:url

  • event.target:被觸碰的對象(display object)引用
  • event.name:"tap"字符串
  • event.numTaps:屏幕上tap的個數。默認兩次tap序列之間的延遲爲0,可是這個事件能夠經過system.setTapDelay()函數來調整。
  • event.x / event.y:在屏幕座標系裏,tap發生的位置的x和y

不像touch event,tap事件並不包括一個phase屬性 -- 這個tap就是一個單一的動做,同時包括了接觸和放開。因此你不須要以任何形式處理階段信息(phase)。spa

1.1 過濾雙擊(double tap):code

使用event.numTaps屬性,你能夠輕易肯定一個對象是否被雙擊,而且區別在這個對象上的屢次單擊。htm

爲了作到這一點,只要確保event.numTaps等於2,而且忽略其餘全部狀況(return true):對象

local function myTapListener( event )

    if ( event.numTaps == 2 ) then
        print( "object double-tapped = "..tostring(event.target) )
    else
        return true
    end
end

local myButton = display.newRect( 100, 100, 200, 50 )
myButton:addEventListener( "tap", myTapListener )

 

2 Touch檢測

Touch事件提供了更高級的屏幕交互。經過touch事件,你能夠檢測到用戶首次接觸到屏幕,以及何時放開屏幕。你也能夠跟蹤用戶手指在屏幕上的滑動軌跡。爲了完成這個目標,Corona提供了event.phase屬性的四種狀態:

  • "began":表示手指剛接觸到屏幕
  • "moved":表示手指正在屏幕上移動
  • "ended":表示手指剛從屏幕上放開
  • "cancelled":表示系統取消了對此次接觸的跟蹤(不要和ended混淆了)

在Corona裏,你能夠監聽在大多數顯示對象上註冊的touch事件監聽器:

local function myTouchListener( event )

    if ( event.phase == "began" ) then
        --code executed when the button is touched
        print( "object touched = "..tostring(event.target) )  --'event.target' is the touched object
    elseif ( event.phase == "moved" ) then
        --code executed when the touch is moved over the object
        print( "touch location in content coordinates = "..event.x..","..event.y )
    elseif ( event.phase == "ended" ) then
        --code executed when the touch lifts off the object
        print( "touch ended on object "..tostring(event.target) )
    end
    return true  --prevents touch propagation to underlying objects
end

local myButton = display.newRect( 100, 100, 200, 50 )
myButton:addEventListener( "touch", myTouchListener )  --add a "touch" listener to the object

這裏event的屬性包括下列字段:

  • event.id:一個惟一的標識,用來區別透過不一樣的touch事件傳來的多處觸摸。詳見後下節multitouch。
  • event.target:被接觸到的對象(display object)
  • event.name:"touch"字符串
  • event.phase:上面所描述的觸摸的階段
  • event.time:自從應用開始運行到如今的毫秒數,用來累計時間間隔
  • event.x / event.y:在屏幕座標系裏,接觸位置的x和y
  • event.xStart / event.yStart:在屏幕座標系裏,觸摸序列發生的began階段時的位置的x和y

 

3 Multitouch檢測

在應用中啓動多點觸控(multitouch)可讓檢測和處理,同時在屏幕上多處發生的用戶觸摸事件。

由於默認狀況下,multitouch是被關閉的,因此你必須經過system.activate()函數來啓動它。注意,多點觸控功能只能在實際真機上測試,而不能在Corona模擬器裏測試。

system.activate( "multitouch" )

開啓多點觸控之後,註冊到對象上的touch事件監聽器,和前面描述touch檢測同樣。而後,經過比較event.id屬性,來肯定touch事件序列中哪個觸碰被返回。

system.activate( "multitouch" )

local myRectangle = display.newRect( 0, 0, 320, 480 )

local function multitouchListener( event )
    print( "Phase: "..event.phase )
    print( "Location: "..event.x..","..event.y )
    print( "Unique touch ID: "..tostring(event.id) )
    print( "----------" )
    return true
end

myRectangle:addEventListener( "touch", multitouchListener )
相關文章
相關標籤/搜索