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


    本教程主要讲解一下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 )
  • 相关阅读:
    Hadoop TextInputFormat源码分析
    Hadoop集群(第6期)_WordCount运行详解
    spring boot之从零开始开发自己的网站
    transfer learning
    深度学习理论
    CNN卷积可视化与反卷积
    resnet
    NLP资料
    close Spark Streaming gratefully
    CUDA
  • 原文地址:https://www.cnblogs.com/leezj/p/4238838.html
Copyright © 2020-2023  润新知