Corona SDK新手教程:tap、touch和multitouch的区别

摘要:
本教程主要介绍轻敲、触摸和多点触摸之间的区别,以及如何处理每种方法。如果你是新手,你可以回顾上一篇文章“CoronaSDK和事件检测的交互系统”。1点击检测点击事件是用户与触摸屏之间最基本的交互。为此,只需确保事件NumTaps等于2,并忽略所有其他情况:localfunctionmyTapListenerfthenprintelsereturntruewendlocalmyButton=显示NewRectmyButton:addEventListener2Touch检测触摸事件并提供更高级的屏幕交互。由于多点触摸在默认情况下已关闭,您必须通过系统启动它。activate()功能。系统在激活多点触摸之后,注册到对象的触摸事件监听器与前面描述的触摸检测相同。

本教程主要讲解一下tap、touch和multitouch的区别,以及如何处理每种方式。

如果是新手的话,可以先复习一下之前的文章 CoronaSDK之交互系统和事件检测

1 Tap检测

Tap事件是用户和触屏之间交互最基础的一种。本质上来说,一个tap就是表示用户用手指接触到屏幕,然后在差不多附近的位置再抬起的过程。这个tap事件只有在用户在同一个点接触和放开屏幕,才作为tap事件成功的发生。

在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参数包括下列字段:

  • 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)。

1.1 过滤双击(double tap):

使用event.numTaps属性,你可以轻易确定一个对象是否被双击,并且区别在这个对象上的多次单击。

为了做到这一点,只要确保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 )

免责声明:文章转载自《Corona SDK新手教程:tap、touch和multitouch的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇easyUI制作slider小滑块,可拖动和精确输入CSS before和after伪元素下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#装箱和拆箱简介

装箱和拆箱发生在数据类型转换。 先看下装箱和拆箱的概念: 装箱:值类型向引用类型或者值类型转化成它实现的某个接口 拆箱:引用类型向值类型或者接口类型转化成值类型 比如说: int x=5; object o=x; //装箱 y=(int)o; //拆箱 object为引用类型,其他的数据类型int,string,bool等继承于objec...

vue中 拖动元素边框 改变元素宽度

先上效果图: 如图所示,通过拖动来改变表单的宽度。 但实际上,这边并不是表单的边框,而是一个单独的组件。通过监听鼠标的down,move以及up事件。 我们可以单独的写个组件handle.vue。 <template> <div @mousedown="mouseDown"></div> </templa...

ZK框架笔记5、事件

        事件是org.zkoss.zk.ui.event.Event类,它通知应用程序发生了什么事情。每一种类型的事件都由一个特定的类来表示。         要响应一个事件,应用程序必须为事件注册一个或更多事件监听器。有3种方式可以为一个组件事件监听器。   (1)一般制定onXXX事件监听器为组件的属性,作为属性定义的事件监听器。 &...

laravel添加api缓存系统

项目背景:最初是想给接口加缓存,但是不想每个接口添加缓存代码,就写了个统一的缓存系统。 技术方案: 本项目使用laravel框架 监听requestHanled事件写入缓存 添加apiCache中间件,对每个get访问进行拦截,检查是否有缓存,如果有,就读取缓存就返回,如果没有,就执行下一个中间件。 前置知识: laravel框架基础知识 event...

div拖拽, onmousedown ,onmousemove, onmouseup

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style type="text/css"> 7...

19.QT-事件发送函数sendEvent()、postEvent()

Qt发送事件分为两种 -阻塞型事件发送 需要重写接收对象的event()事件处理函数 当事件发送后,将会立即进入event()事件处理函数进行事件处理 通过sendEvent()静态函数实现阻塞发送: bool QApplication::sendEvent ( QObject * receiver, QEvent * event ) ;...