【iphone】处理多点触控

news/2024/11/17 22:19:57/

【iphone】处理多点触控

(转自:http://miaoshuanghe.blog.163.com/blog/static/14013047620107100457798/)


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://www.ppmy.cn/news/484978.html

相关文章

Android中的多点触摸

我的学习视频地址,一起来学习Android… http://edu.csdn.net/course/detail/2741/43164?auto_start1> 代码下载地址 代码一&#xff1a;自定义支持多点触摸的TextView http://download.csdn.net/detail/zhiyuan0932/9513852 什么是多点触摸 允许计算机用户同时通过多个…

STM32模拟USB多点触控屏

STM32模拟USB多点触控屏 开发准备 STM32的USB官方例程库JoyStickMouseSTM32F103RCWindows7 代码修改 1.usb_pwr.c RESULT PowerOn(void) {u16 wRegVal; //USB_Cable_Config(ENABLE);//这里由于硬件问题用不到&#xff0c;注释/*** CNTR_PWDN 0 ***/w…

多点触控参数

简介 为了使用功能强大的多点触控设备&#xff0c;就需要一种方案去上报用户层所需的详细的手指触摸数据。这个文档所描述的多点触控协议可以让内核驱动程序向用户层上报任意多指的数据信息。 使用说明 单点触摸信息是以ABS承载并按一定顺序发送&#xff0c;如BTN_TOUCH、ABS…

C语言易错剖析(1)-数据类型

C语言易错剖析 int8_t、int16_t、int32_t、int64_t、uint8_t、size_t、ssize_t等数据类型 int_t同类 int_t 为一个结构的标注&#xff0c;可以理解为type/typedef的缩写&#xff0c;表示它是通过typedef定义的&#xff0c;而不是一种新的数据类型。因为跨平台&#xff0c;不…

多点触控与单点触控

private ImageView mImageView;private Matrix matrix new Matrix();private Matrix savedMatrix new Matrix();private static final int NONE 0;private static final int DRAG 1;private static final int ZOOM 2;private int mode NONE;// 第一个按下的手指的点priv…

多点触摸处理

接着上文&#xff0c;我们做了一个简陋的下拉刷新控件&#xff0c;目前用到的知识点有 view的滑动view的弹性滑动事件分发机制事件分发机制的两个小问题&#xff08;事件的二次分发&#xff09; 目前这个控件除了简陋一点&#xff0c;没做抽象封装&#xff0c;在单手操作下&a…

多点触控 - MFC

概述 Windows 7 支持用户通过手指接触来管理应用程序&#xff0c;无需使用中间设备。这扩展了平板 PC 基于触笔的功能。与其他指针设备不同&#xff0c;这种新功能允许多个输入事件在不同指针位置同时发生&#xff0c;它还支持复杂的场景&#xff0c;比如通过十个手指或多个并…

多点触控

1.要了解多点触控&#xff0c;我们必须先了解一下View的生命周期&#xff0c;毕竟在Android用的到多点触控的地方&#xff0c;一般都是自定义控件。就像Fragment和Activity都有生命周期一样&#xff0c;View也有自己的生命周期。该生命周期并不直接和展示它的Fragment或者Activ…