触屏事件

iphone ipad开发: 关于触屏事件的一些操作

[cpp] view plaincopyprint?

  1. //轻击:
  2. //需要在你的ViewController里重写几个方法:
  3. //开始触摸的方法
  4. - (void)touchesBegan:(NSSet *)touches
  5. withEvent:(UIEvent *)event
  6. {
  7. messageLabel.text = @”Touches Began”;
  8. [self updateLabelsFromTouches:touches];
  9. }
  10. //触摸取消的方法
  11. - (void)touchesCancelled:(NSSet *)touches
  12. withEvent:(UIEvent *)event
  13. {
  14. messageLabel.text = @”Touches Cancelled”;
  15. [self updateLabelsFromTouches:touches];
  16. }
  17. //触摸结束的方法
  18. - (void)touchesEnded:(NSSet *)touches
  19. withEvent:(UIEvent *)event
  20. {
  21. messageLabel.text = @”Touches Stopped.”;
  22. [self updateLabelsFromTouches:touches];
  23. }
  24. //触摸移动的方法
  25. - (void)touchesMoved:(NSSet *)touches
  26. withEvent:(UIEvent *)event
  27. {
  28. messageLabel.text = @”Drag Detected”;
  29. [self updateLabelsFromTouches:touches];
  30. }
  31. //触摸-清扫:
  32. //开始触摸
  33. - (void)touchesBegan:(NSSet *)touches
  34. withEvent:(UIEvent *)event
  35. {
  36. UITouch *touch = [touches anyObject];
  37. gestureStartPoint = [touch locationInView:self.view];
  38. }
  39. //kMinimumGestureLength 最小移动长度 kMaximumVariance最大偏移长度
  40. - (void)touchesMoved:(NSSet *)touches
  41. withEvent:(UIEvent *)event
  42. {
  43. UITouch *touch = [touches anyObject];
  44. CGPoint currentPosition = [touchlocationInView:self.view];
  45. CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x);
  46. CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y);
  47. if(deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance)
  48. {
  49. label.text = @”Horizontal swipe detected”;
  50. [self performSelector:@selector(eraseText)
  51. withObject:nilafterDelay:2];
  52. }
  53. else if (deltaY >= kMinimumGestureLength &&
  54. deltaX <= kMaximumVariance)
  55. {
  56. label.text = @”Vertical swipe detected”;
  57. [selfperformSelector:@selector(eraseText)withObject:nilafterDelay:2];
  58. }
  59. }
  60. //多次轻击判断,比如双击,三击等:
  61. //单击动作响应事件
  62. - (void)singleTap
  63. {
  64. singleLabel.text = @”Single Tap Detected”;
  65. [selfperformSelector:@selector(eraseMe:)
  66. withObject:singleLabel
  67. afterDelay:1.6f];//1.6秒后执行eraseMe方法
  68. }
  69. //双击
  70. - (void)doubleTap
  71. {
  72. doubleLabel.text = @”Double Tap Detected”;
  73. [selfperformSelector:@selector(eraseMe:)
  74. withObject:doubleLabel
  75. afterDelay:1.6f];
  76. }
  77. //三击
  78. - (void)tripleTap
  79. {
  80. tripleLabel.text = @”Triple Tap Detected”;
  81. [selfperformSelector:@selector(eraseMe:)
  82. withObject:tripleLabel
  83. afterDelay:1.6f];
  84. }
  85. //四击
  86. - (void)quadrupleTap
  87. {
  88. quadrupleLabel.text = @”Quadruple Tap Detected”;
  89. [selfperformSelector:@selector(eraseMe:)
  90. withObject:quadrupleLabel
  91. afterDelay:1.6f];
  92. }
  93. - (void)eraseMe:(UITextField *)textField
  94. {
  95. textField.text = @"";
  96. }
  97. - (void)touchesBegan:(NSSet *)touches
  98. withEvent:(UIEvent *)event
  99. {
  100. UITouch *touch = [touches anyObject];   //实例一个uitouch
  101. NSUInteger tapCount = [touch tapCount]; //计算touch的tapCount次数
  102. switch (tapCount)
  103. {
  104. case 1:
  105. [selfsingleTap];
  106. break;
  107. case 2:
  108. [selfdoubleTap];
  109. break;
  110. case 3:
  111. [selftripleTap];
  112. break;
  113. case 4:
  114. [selfquadrupleTap];
  115. break;
  116. default:
  117. break;
  118. }
  119. }
  120. //[self performSelector:@selector(eraseMe:)withObject:singleLabel afterDelay:1.6f]中
  121. //performSelector:@selector(eraseMe:)withObject:singleLabel afterDelay:1.6f方法为将来afterDelay1.6秒之后调用eraseMe方法
  122. //同样的[NSObect  cancelPreviousPerformSelector:withObject :afterDelay:];
  123. //方法为取消这些将来的调用
  124. //捏合操作:
  125. - (void)eraseLabel
  126. { //清空lable
  127. label.text = @"";
  128. }
  129. //开始触碰
  130. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  131. {
  132. if([touches count] ==2)
  133. { //检测是否为两个手指触点
  134. NSArray *twoTouches = [touchesallObjects];
  135. UITouch *first = [twoTouchesobjectAtIndex:0];
  136. UITouch *second = [twoTouchesobjectAtIndex:1];
  137. initialDistance = distanceBetweenPoints(
  138. [first locationInView:self.view], [secondlocationInView:self.view]);
  139. }
  140. }
  141. //移动手指
  142. - (void)touchesMoved:(NSSet *)touches
  143. withEvent:(UIEvent *)event
  144. {
  145. if ([touches count] == 2)
  146. {
  147. NSArray *twoTouches = [touchesallObjects];
  148. UITouch *first = [twoTouchesobjectAtIndex:0];
  149. UITouch *second = [twoTouchesobjectAtIndex:1];
  150. CGFloat currentDistance =distanceBetweenPoints(
  151. [first locationInView:self.view],[secondlocationInView:self.view]);
  152. if (initialDistance ==0)
  153. {
  154. initialDistance = currentDistance;//根据移动前后的坐标距离差检测是捏合的手势还是打开的手势
  155. }
  156. else if (currentDistance - initialDistance > kMinimumPinchDelta)
  157. { //检测是否大于最小移动值kMinimumPinchDelta
  158. label.text = @”Outward Pinch”;
  159. [selfperformSelector:@selector(eraseLabel)
  160. withObject:nil
  161. afterDelay:1.6f];
  162. }
  163. else if (initialDistance - currentDistance > kMinimumPinchDelta)
  164. {
  165. label.text = @”Inward Pinch”;
  166. [selfperformSelector:@selector(eraseLabel)
  167. withObject:nil
  168. afterDelay:1.6f];
  169. }
  170. }
  171. }
  172. //触碰结束
  173. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
  174. {
  175. initialDistance = 0;
  176. }
  177. //自定义手势“√”:
  178. - (void)eraseLabel
  179. {
  180. label.text = @"";
  181. }
  182. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  183. {
  184. UITouch *touch = [touches anyObject];
  185. CGPoint point = [touch locationInView:self.view];
  186. lastPreviousPoint = point;
  187. lastCurrentPoint = point;
  188. lineLengthSoFar = 0.0f;
  189. }
  190. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  191. {
  192. UITouch *touch = [touches anyObject];
  193. CGPoint previousPoint = [touchpreviousLocationInView:self.view];
  194. CGPoint currentPoint = [touch locationInView:self.view];
  195. //计算两条线之间的角度
  196. CGFloat angle = angleBetweenLines(lastPreviousPoint,
  197. lastCurrentPoint,previousPoint,currentPoint);
  198. //检测手势被承认的条件 kMinimumCheckMarkAngle最小角度
  199. //kMaximumCheckMarkAngle最大角度
  200. //kMinimumCheckMarkLength画线最小长度
  201. if (angle >= kMinimumCheckMarkAngle &&
  202. angle <= kMaximumCheckMarkAngle &&
  203. lineLengthSoFar > kMinimumCheckMarkLength)
  204. {
  205. label.text = @”Checkmark”;
  206. [selfperformSelector:@selector(eraseLabel)
  207. withObject:nil
  208. afterDelay:1.6];
  209. }
  210. //lineLengthSoFar,lastPreviousPoint,lastCurrentPoint重新赋值
  211. lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);
  212. lastPreviousPoint = previousPoint;
  213. lastCurrentPoint = currentPoint;
  214. }
  215. //这里用到一个判断两条直线的角度的方法
  216. //angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPointlin2End);
  217. //给一个几何方法集的接口方法:
  218. //CGPointUtils.h 头文件
  219. #import <CoreGraphics/CoreGraphics.h>
  220. CGFloat distanceBetweenPoints (CGPoint first,CGPoint second);
  221. CGFloat angleBetweenPoints(CGPoint first, CGPoint second);
  222. CGFloat angleBetweenLines(CGPoint line1Start,CGPoint line1End, CGPoint line2Start,CGPoint lin2End);
  223. //.c文件 CGPointUtils.c
  224. #include ”CGPointUtils.h”
  225. #include <math.h>
  226. #define pi 3.14159265358979323846
  227. #define degreesToRadian(x) (pi * x / 180.0)
  228. #define radiansToDegrees(x) (180.0 * x / pi)
  229. CGFloat distanceBetweenPoints (CGPoint first,CGPoint second)
  230. {
  231. CGFloat deltaX = second.x - first.x;
  232. CGFloat deltaY = second.y - first.y;
  233. return sqrt(deltaX*deltaX + deltaY*deltaY );
  234. };
  235. CGFloat angleBetweenPoints(CGPoint first, CGPoint second)
  236. {
  237. CGFloat height = second.y - first.y;
  238. CGFloat width = first.x - second.x;
  239. CGFloat rads = atan(height/width);
  240. returnradiansToDegrees(rads);
  241. //degs = degrees(atan((top – bottom)/(right – left)))
  242. }
  243. CGFloat angleBetweenLines(CGPoint line1Start,CGPoint line1End, CGPoint line2Start,CGPoint line2End)
  244. {
  245. CGFloat a = line1End.x - line1Start.x;
  246. CGFloat b = line1End.y - line1Start.y;
  247. CGFloat c = line2End.x - line2Start.x;
  248. CGFloat d = line2End.y - line2Start.y;
  249. CGFloat rads = acos(((a*c) + (b*d)) / ((sqrt(a*a + b*b)) * (sqrt(c*c + d*d))));
  250. returnradiansToDegrees(rads);
  251. }
时间: 2024-10-03 14:05:24

触屏事件的相关文章

Android的触屏事件

Android系统中的每个View的子类都包含的三种和touchevent有关的三种方法. ondispathTouchEvent(); 这个方法用来分发TouchEventonInterceptTouchEvent(); 这个方法用来拦截TouchEventonTouchEvent: 这个方法用来处理TouchEvent 每次触屏事件,都有最顶层的View的ondispathTouchEvent()接受,由这个方法进行分发.当方法返回true时 ,就将触屏事件传递给该View的OntouchE

【COCOS2D-X 备注篇】cocos2dx 获取手机截屏等意外取消触屏事件的处理方法!

最近有童鞋问我如何获取到iphone手机截屏的事件,所以本篇就简单的聊下这种问题的处理办法. 在cocos2dx引擎中,我们能在AppDelegate中获取到,用户将应用切入后台,以及重新返回应用的事件函数.那么对应的,cocos2dx也在引擎中给予我们截取屏幕等这种只能手机应有事件的处理函数. 其实大家应该都很熟悉截取用户触屏的函数,如下: 1 2 3 4 // default implements are used to call script callback if exist virtu

移动端touch触屏滑动事件、滑动触屏事件监听!

移动端touch触屏滑动事件.滑动触屏事件监听! 一.触摸事件 ontouchstart.ontouchmove.ontouchend.ontouchcancel 目前移动端浏览器均支持这4个触摸事件,包括IE.由于触屏也支持MouseEvent,因此他们的顺序是需要注意的:touchstart → mouseover → mousemove → mousedown → mouseup → click1 Apple在iOS 2.0中引入了触摸事件API,Android正迎头赶上这一事实标准,缩小

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发 做项目的时候经常遇到需要事件分发,很多时候我们发现当我们触发了onTouch却触发不了onClick.或者触发了View的事件却触发不了ViewGroup的事件.那么他们之间到底是什么关系呢,其实最终他们涉及的只是两个问题 OnTouch .onClick .onTouchEvent 之间的关系 OnTouch .onClick .onTouchEvent 之间的处理顺序 这里,我做了简单

View实现事件监听DEMO(文本跟随触屏事件)

View 是一个显示的视图,内置的画布通过重写Ondraw(Canvas canvas);方法获得,同时提供图形绘制函数.触屏事件.按键事件等. 现在利用一个简单的demo演示一下几个重要的常用到的方法: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.K

html5之移动触屏事件

HTML5的javascript touch事件 HTML5+CSS3, javascript Add comments 四282013 以下是几种普及得比较好的触摸事件,可以在绝大多数现代浏览器中来测试这一事件(必须是触屏设备): (on)touchstart:触摸开始的时候触发 (on)touchmove:手指在屏幕上滑动的时候触发 (on)touchend:触摸结束的时候触发 (on)touchcancel:系统取消touch事件的时候触发.例如电话接入或者弹出信息.一般用在游戏:玩着的时

25.Unity3D手机中Input类touch详解-Unity触屏事件解析到底(Twisted Fate)

首先贴一下Unity支持的模型文件类型,以前没有收集过. Unity支持两种类型的3D文件格式: 1.  通用的"出口型"3D文件 如.fbx..dae..3ds..dxf..obj等文件格式. 2.  3D软件专用的3D文件格式 如Max, Maya, Blender,Cinema4D, Modo, Lightwave & Cheetah3D 等软件所支持的格式,如.MAX, .MB, .MA等等. Unity3D手机中Input类touch详解: 1.Input.touch

android实现横竖屏8个方向触屏事件的捕捉并有相对应的动画提示

1:首先来说横竖屏的问题 这里我是在onCreate方法中直接强制横屏竖屏的设置, Button btn; SurfaceView surfaceView; //初始化布局 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); addListener(); } //初始化 pri

转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比如对音量进行调节(模拟音量键),关闭前台正在运行的App(模拟返回键),或者模拟触屏事件.但是对于原生安卓系统而言,后台进程关闭前台进程,甚至模拟用户事件,进而操控整个系统,是不符合系统安全原则的,如果有这样的漏洞被病毒或恶意软件所利用,会非常危险. 由于一些特殊原因,我恰巧需要实现这样的功能,而又