`
bluepeer
  • 浏览: 74450 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iphone处理多点触控

 
阅读更多

UIView 继承的 UIResponder (负责UI事件处理) 类中提供了四个方法处理多点触控:

- (void )touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ;

- (void )touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event ;

- (void )touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event ;

- (void )touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event ;

 
touchesBegan方法在触控开始时被调用,
touchesMoved方法在触控移动时被调用
touchesEnded方法在触控结束时被调用
touchesCancelled方法在系统强制结束触控时被调用
 
上述方法的参数:
  1. event 为触控动作引发的UI事件,只有发生了UI事件UIResponder的相应处理方法才会被调用。传递给上述方法的UI事件都是“touch”类型的,它 关联了一系列UITouch对象来代表发生该事件时所有处于各种状态(began, moved, ended, cancelled )下的触控动作。
  2. touches 同样是一系列 UITouch 对象的集合(NSSet),不过它只包含处于特定状态的触控动作。比方说调用touchesBegan 时传递的就是所有处在 began 状态(phase)的UITouch对象。

相关类型说明:

  • UIEvent 对象代表了 iPhone OS 中一个UI事件,主要有三种类型: touch,motion,remote control 。
  • UITouch对象代表一根手指在某一个UI事件发生时刻的动作,它有四种状态(phase),began, moved, ended, cancelled 。
  • 触控动作会引发 touch 类的UI事件,而这个UI事件中也就包括了一系列 UITouch 对象来记录当时的所有手指的动作。当 touch 类型的UI事件发生的时候会被交给 UIResponder 处理,继而调用上述四个方法。
 
OpenGL ES 程序模板中的多点触控处理
  • OES 程序模板中的类继承关系为   EAGLView : UIView : UIResponder 
  • 在 EAGLView 类中实现了上述四个方法,并分别在其中用不同的标签调用 ESRenderer 的 view 方法。
  • ESRenderer 协议(就是接口)中提供了四个同名同参的 view 方法,用标签(緑)来区分调用:

@optional

- (void )view:(UIView *)view touchesBegan :(NSSet *)touches withEvent:(UIEvent *)event ;

- (void )view:(UIView *)view touchesMoved :(NSSet *)touches withEvent:(UIEvent *)event ;

- (void )view:(UIView *)view touchesEnded :(NSSet *)touches withEvent:(UIEvent *)event ;

- (void )view:(UIView *)view touchesCancelled :(NSSet *)touches withEvent:(UIEvent *)event ;

  • 实现了ESRenderer接口的 ES1Renderer 和 ES2Renderer 最终在 View 方法中负责触控事件的处理。 
获取各种触控信息的方法
  1. 获取触控对象(UITouch)
  • 通过 event 参数获取 UITouch 集合  

- (NSSet *)allTouches;                             所有关联的UITouch

- (NSSet *)touchesForWindow:(UIWindow *)window;    指定窗口的UITouch

- (NSSet *)touchesForView:(UIView *)view;          指定View上的UITouch

- (NSSet *)touchesForGestureRecognizer:(UIGestureRecognizer *)gesture __OSX_AVAILABLE_STARTING (__MAC_NA ,__IPHONE_3_2 );

  • touches 参数本身就是处在当前状态的UITouch集合
  • 从 touches 集合中随机获取一个UITouch
[touches anyObject ];
  1.  UITouch 对象的各种属性
  • timestamp   这个触控对象最后改变的时间戳。 用从系统启动到现在的时间来表示,float类型。开始时和移动时会更新。
  • tapCount  连续点击的次数。一旦中断就重新计数。
  • phase   这个触控对象的所处状态。 枚举类型。
  • locationInView()  在自己所属View中的位置。
 
示例代码( Metronome by Apple )
 

- (void )touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches ] anyObject ];

    lastLocation = [touch locationInView :self ];

}

 

- (void )touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches ] anyObject ];

    CGPoint location = [touch locationInView :self ];

 

    CGFloat xDisplacement = location.x - lastLocation .x ;

    CGFloat yDisplacement = location.y - lastLocation .y ;

    CGFloat xDisplacementAbs = fabs (xDisplacement);

    CGFloat yDisplacementAbs = fabs (yDisplacement);

 

    // If the displacement is vertical, drag the weight up or down. This will impact the speed of the oscillation.

    if ((xDisplacementAbs < yDisplacementAbs) && (yDisplacementAbs > 1 )) {  

        [ self stopSoundAndArm];

        [self dragWeightByYDisplacement :yDisplacement];

        lastLocation = location;

        tempoChangeInProgress = YES ;

    } else if (xDisplacementAbs >= yDisplacementAbs) {  

        // If displacement is horizontal, drag arm left or right. This will start oscillation when the touch ends.

        CGFloat radians = atan2f (location.y - kArmBaseY , location.x - kArmBaseX );

        CGFloat rotation = RadiansToDegrees (radians) + 90.0 ;

        [self rotateArmToDegree :rotation];

    }

}

 

- (void )touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[event allTouches ] anyObject ];

    CGPoint location = [touch locationInView :self ];

 

    CGFloat xDisplacement = location.x - lastLocation .x ;

    CGFloat yDisplacement = location.y - lastLocation .y ;

    CGFloat xDisplacementAbs = fabs (xDisplacement);

    CGFloat yDisplacementAbs = fabs (yDisplacement);

 

    [ self stopSoundAndArm];

 

    if ( tempoChangeInProgress) {  

        [self dragWeightByYDisplacement :yDisplacement];

        [ self startSoundAndAnimateArmToRight: YES ];

        tempoChangeInProgress = NO ;

    } else if (xDisplacementAbs > yDisplacementAbs) {

        // horizontal displacement, start oscillation

        BOOL startToRight = (xDisplacement >= 0.0 ) ? YES : NO ;

        [ self startSoundAndAnimateArmToRight:startToRight];

    }

}

 

- (void )touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {

    tempoChangeInProgress = NO ;

    [ self stopSoundAndArm];

}

作者:鬼舞者
原文:http://miaoshuanghe.blog.163.com/

分享到:
评论

相关推荐

    处理iPhone多点触控事件

    总之,掌握如何处理iPhone多点触控事件,需要对`UIResponder`类的事件处理方法有深入的理解,同时能够合理利用`UITouch`对象提供的信息来实现复杂的交互功能。通过准确识别不同的手势和触摸阶段,开发者可以创建出既...

    CTP多点触控的实现

    但是,iPhone采用了一种名为“投射电容式”(Projected Capacitive)的技术来实现多点触控功能,这使得人们的注意力转向了新的触控技术。除了iPhone之外,还有LG Prada手机、iPod Touch、Samsung Yepp YP-P2媒体...

    iphone范例代码,多点触控

    iPhone作为一款广泛使用的智能设备,其用户界面设计和交互体验很大程度上依赖于多点触控技术。本范例代码就是针对这一主题,帮助开发者了解并实践在iPhone应用中实现多点触控的方法。 首先,我们要理解iOS中的触控...

    自制MulitTouch多点触控

    - **MTminiSoftwarePackage**:这是一个开源的多点触控软件包,用于处理摄像头捕捉到的图像,并将其转换为多点触控事件。需要Java runtime 1.6环境支持。 #### 制作流程 1. **构建框架**:使用木板切割并拼装成一...

    多点触控交互方式的回顾与展望

    多点触控技术的核心在于其能够准确地识别并处理多个接触点的位置和动作。目前,实现多点触控的方式主要包括光学式和投射电容式两种。 ##### 2.1 光学式多点触控 光学式多点触控技术通过检测手指接触或手势变化导致...

    基础电子中的多点触控技术实现面面观

    然而,真正将多点触控推向大众视野的是2007年苹果公司推出的iPhone。这款革命性的设备通过创新的电容式触控屏,简化了传统手机的按键设计,使得用户可以通过直观的触摸和手势来与设备交互,极大地提升了用户体验。 ...

    AR 多点触控大屏 蓝牙 等新技术应用PPT教学课件.pptx

    这篇PPT教学课件主要介绍了几种新兴的科技应用,包括增强现实(AR)、多点触控大屏、蓝牙技术和近场通信(NFC)等。这些技术正在改变我们的生活方式,尤其是在娱乐、信息获取和交互体验方面。 首先,AR增强现实是一...

    AR多点触控大屏蓝牙等新技术应用PPT教学课件.pptx

    这份PPT教学课件主要介绍了几种新兴的科技应用,包括AR增强现实、多点触控技术、蓝牙互动、动态捕捉、三维全息影像以及NFC近距离通信技术。这些技术正在改变我们与信息交互的方式,特别是在广告传播、产品展示和娱乐...

    显示/光电技术中的带多点触控功能的电容式触摸屏方案

    然而,真正将其推向大众市场的,是苹果公司的iPhone,它将多点触控技术应用于手持设备,引发了革命性的变革。多点触控的普及得益于技术的成熟和成本的降低,使得这项技术不仅可靠,而且经济实惠,广泛应用于手机、...

    韩国ATLab开发出多点触控式电阻膜技术

    韩国ATLab Inc宣布开发出电阻式多点触控(Resistive Multi Touch,R-MT)技术,Han wool Information Tech (HWIT)公司将负责制作产品。据ATLab表示,其技术具备电阻膜触控屏幕的低价优势,且性可超越iPhone。  ATLab...

    android图片多点触屏原理例子

    在Android平台上,多点触控(Multi-touch)技术极大地丰富了用户与设备的交互方式,尤其是在处理图片和其他视觉内容时。本节将深入探讨Android多点触屏的原理,并通过实例来帮助你理解和掌握这一技术。 多点触控是...

    带多点触控功能的电容式触摸屏方案

     从用户输入界面来看,多点触控并非创举。早在1982年,多伦多大学的一个科研项目中就提出了多点输入的用户界面,在当时的项目中,由于使用了相机成像的技术,任意点的触摸都可以同时被感应到。那么,为什么当多点...

    iphone 多点触摸

    在软件层面,iPhone SDK提供了强大的支持来处理多点触摸事件。主要涉及以下核心类: - `UIResponder`:这是所有可以接收和处理事件的对象的基类,包括`UIApplication`、`UIViewController`和`UIView`。它们都继承了...

    多点触摸技术手册繁体版

    自2006年以来,随着苹果iPhone等产品的推出,多点触控技术得到了广泛应用和发展。 #### 二、自然用户界面小组(Natural User Interface Group, NUIGroup) - **成立背景**:NUIGroup成立于2006年,是一个专注于...

    iPhone触摸屏工作原理.pdf

    同时,多点触控的处理算法复杂,有时会出现误识别。 总结,iPhone的触摸屏技术代表了移动设备人机交互的重要进步,电容式触摸屏及其多点触控功能显著提升了用户体验,但也面临着技术挑战和优化空间。随着科技的发展...

    HTML5多点触摸演示(利用Canvas绘图)

    利用HTML5实现多点触摸,在Canvas上实时绘制...(注意:本页面要在iPhone和iPad上运行才能看到效果哦!)代码简单易懂,在iPad上运行效果最佳。相关技术请参考:http://blog.sina.com.cn/s/blog_4cdc44df0100t5fd.html

    斯坦福大学iPhone教程-14.zip

    本压缩包文件包含了斯坦福大学C193P iPhone Application Programming课程的第14课教学资料,专注于讲解多点触控事件(Multi-Touch Events)这一核心概念。在iOS应用开发中,理解和熟练运用多点触控事件对于构建用户...

    触控手机两点

    触控手机两点主要涉及到的是智能手机中的多点触控技术,这是一种在移动设备上广泛使用的人机交互方式。在现代智能手机中,多点触控技术极大地丰富了用户与设备的交互体验,使得用户可以通过手指的触摸动作来实现各种...

    iPhone触摸屏工作原理

    iPhone通过软件优化,使其电容式触摸屏能够处理多点触控,这是通过互电容或自电容技术实现的。互电容涉及两层不同的导电材料,驱动线路和传感线路交互作用,而自电容则只有一个电极层。当用户触摸屏幕时,电容变化会...

Global site tag (gtag.js) - Google Analytics