苹果和安卓的手指unity 安卓触摸事件件的区别

今天台风&海马&袭击深圳,全市停工。现分享一篇关于touch的文章,望指教!
当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY;
当触发touchmove事件时,在获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过这两次获取的坐标差值来判断手指在手机屏幕上的滑动方向。
具体代码如下:
$("body").on("touchstart", function(e) {
e.preventDefault();
startX = e.originalEvent.changedTouches[0].pageX,
startY = e.originalEvent.changedTouches[0].pageY;
$("body").on("touchmove", function(e) {
e.preventDefault();
moveEndX = e.originalEvent.changedTouches[0].pageX,
moveEndY = e.originalEvent.changedTouches[0].pageY,
X = moveEndX - startX,
Y = moveEndY - startY;
if ( X & 0 ) {
alert("left 2 right");
else if ( X & 0 ) {
alert("right 2 left");
else if ( Y & 0) {
alert("top 2 bottom");
else if ( Y & 0 ) {
alert("bottom 2 top");
alert("just touch");
总结:touchmove的最后坐标减去touchstart的起始坐标。
X的结果如果正数,则说明手指是从左往右划动;
X的结果如果负数,则说明手指是从右往左划动;
Y的结果如果正数,则说明手指是从上往下划动;
Y的结果如果负数,则说明手指是从下往上划动。
坑开始了&&理想很丰满,显示很骨感!在实际的操作中,手指的上下滑动很难做到直上直下,只要稍微有点斜,只要稍微有点斜,就会被X轴的判断先行接管,而与我们实际的操作意愿相背离。此时就需要添加特殊的判断技巧,代码如下:
$("body").on("touchstart", function(e) {
e.preventDefault();
startX = e.originalEvent.changedTouches[0].pageX,
startY = e.originalEvent.changedTouches[0].pageY;
$("body").on("touchmove", function(e) {
e.preventDefault();
moveEndX = e.originalEvent.changedTouches[0].pageX,
moveEndY = e.originalEvent.changedTouches[0].pageY,
X = moveEndX - startX,
Y = moveEndY - startY;
if ( Math.abs(X) & Math.abs(Y) && X & 0 ) {
alert("left 2 right");
else if ( Math.abs(X) & Math.abs(Y) && X & 0 ) {
alert("right 2 left");
else if ( Math.abs(Y) & Math.abs(X) && Y & 0) {
alert("top 2 bottom");
else if ( Math.abs(Y) & Math.abs(X) && Y & 0 ) {
alert("bottom 2 top");
alert("just touch");
以上代码,在测试时仍不能达到预期的效果,此时要注意到一个事实--$('body').height = 0(此处是个大坑,但有时也不会出现,望大神指教)故还应该在此基础上添加一下代码:
var windowHeight = $(window).height(),
$body = $("body");
// console.log($(window).height());
// console.log($('body').height());
$body.css("height", windowHeight);
&到此,已实现了手机移动端手指的上滑、下滑、左滑和右滑操作。
一些浅显的理解,望大神指教鞭策!
阅读(...) 评论()
Copyright (C)2016 webNick本帖子已过去太久远了,不再提供回复功能。热门:&&           
当前位置:
Android触摸事件的响应机制
作者: Touchscreen &&&&时间: &&&&源于:科技快报&&&&总点击:
【导读】:在用户的一次单手指触摸屏幕过程中,简单的讲,会按顺序产生一个ACTION_DOWN,若干个ACTION_MOVE,和一个ACTION_UP,我们下面的讨论也会基于这个简单case。
&&&&北京时间06月17日消息,中国触摸屏网讯,用户触摸屏幕所产生的Touch Event在Android里是用一个MotionEvent对象来传递和处理的,我们最关注的是MotionEvent里的action,可以看到有ACTION_DOWN, ACTION_UP,ACTION_MOVE,ACTION_CANCEL,ACTION_POINTER_DOWN,ACTION_POINTER_UP等等很多种,在这里面最需要关注的是ACTION_DOWN和ACTION_UP,它们一个代表了用户按压动作的开始,一个代表了用户按压动作的结束,其他的一些ACTION基本都是发生在这2个ACTION之间的(ACTION_CANCEL等特殊的暂不讨论)。&&& 本文来自:
在用户的一次单手指触摸屏幕过程中,简单的讲,会按顺序产生一个ACTION_DOWN,若干个ACTION_MOVE,和一个ACTION_UP,我们下面的讨论也会基于这个简单case。
触摸事件的传递处理顺序
一个触摸事件首先是在硬件层面触发,然后逐层传递到软件直至我们的app,前面的细节一般来说不用了解,我们讨论的事件入口从Activity开始。
笼统的说(实际上细节有所不同,下面会提到)
触摸事件的传递顺序是:
Activity -& 当前活动窗口(PhoneWindow) -& 窗口的Top-Level View(DecorView) -& 各级ViewGroup (如各种Layout) -& ... -& 各级ViewGroup -& 叶子节点 View
而触摸事件的处理顺序则刚好相反:
叶子节点 View -& 各级ViewGroup -& ... -& 各级ViewGroup -& (Window和DecorView只有分发没有处理) -& Activity
当叶子节点View接受到事件之后,会试图做出处理,如果它处理了,则上面各层不再处理,如果它没有处理则往上由它的父ViewGroup处理,这样逐层向上按顺序试图处理,直到Activity。
分发和处理的关键函数
从上面笼统提到的事件分发处理顺序可以看到,关键的分发处理集中在Activity,ViewGroup和View中,那么对于它们来说,有如下几个分发和处理的关键函数,这里先做一个简单介绍,后续再做详细说明。
1,boolean dispatchTouchEvent(MotionEvent event)
这个函数是最关键的分发处理函数,里面既包含了分发的逻辑,又包含了对处理的逻辑调用
分发逻辑:这个函数会先调用子view的dispatchTouchEvent进行分发
处理逻辑:如果子view没有对事件进行消化处理的话,这个函数就会调用本UI组件的处理函数如onTouchEvent
函数返回值表示这个触摸事件是否被当前这个UI组件(Activity/ViewGroup/View)消化处理了
2,boolean onTouchEvent(MotionEvent event)
这个函数是UI组件自己实现用来响应处理触摸事件的
函数返回值表示这个触摸事件是否被当前这个UI组件(Activity/ViewGroup/View)消化处理了
3,View.OnTouchListener: boolean onTouch(View v, MotionEvent event)
这个函数不是Activity/ViewGroup/View本身的响应处理函数,而是一个Listener的响应处理函数
需要给View通过setOnTouchListener来设置Listener以使得这个onTouch函数能够起作用
Activity没有setOnTouchListener
函数返回值表示这个触摸事件是否被当前这个UI组件(Activity/ViewGroup/View)消化处理了
4,ViewGroup: boolean onInterceptTouchEvent(MotionEvent event)
这个函数表明是否要拦截这个事件,前面提到过事件的分发顺序是在View tress里从根到叶子逐层分发,处理则是反向的从叶子到根逐层处理,onInterceptTouchEvent如果返回true,则表示我这一层要拦截这个事件自己进行处理了,不要把它分发到子View里
这个函数只有ViewGroup含有,View没有,因为View已经是叶子节点了,没有子View了
这个函数默认是返回false的,一般不要轻易override它,因为常规来讲是应该由子View先响应处理的
分发和处理的细节流程
ACTION_DOWN的处理
前面说过ACTION_DOWN是一个触摸动作的起始,所以对ACTION_DOWN的处理和对其他事件的处理在细节上是有不同的,各个UI组件对于ACTION_DOWN事件的处理流程可以看到如下:
(注意这里 view 表示一个视图组件,它可以是一个 View 也可以是一个 ViewGroup)
Activity -& dispatchTouchEvent:
通过getWindow().superDispatchTouchEvent(event)把事件分发到当前活动窗口(PhoneWindow),之后是 窗口的Top-Level View(DecorView),调用了DecorView的dispatchTouchEvent,DecorView继承自ViewGroup,所以这里实际上就进入了ViewGroup层面的dispatchTouchEvent
如果superDispatchTouchEvent最终返回true(即下层的某个ViewGroup或者View消化处理了该函数,dispatchTouchEvent返回true),则直接返回
如果返回值为false,则调用Activity的onTouchEvent对事件进行处理
ViewGroup -& dispatchTouchEvent:
首先是检查本view里是否保存了一个motion target(步骤4提到了怎么设置motion target),如果有则清除它
然后是调用onInterceptTouchEvent看这个事件是否需要被自己拦截,如果返回true,则直接进入步骤7开始自己处理事件的流程
如果返回false,则需要遍历所有的子view,遍历的顺序是:
首先按照Z-order
在同一Z值下如果可以的话按照子view的drawing order,这里的drawing order需要ViewGroup的子类override了getChildDrawingOrder才会实际生效
遍历子view的时候,如果这个触摸事件发生的位置在这个view的视觉范围以内,那么就调用child.dispatchTouchEvent将事件分发给这个子view,如果这个子view消化处理了这个事件(即dispatchTouchEvent返回true),本view会将该子view赋值给一个表明motion target的变量,且此时跳出循环
循环遍历结束后,如果有子view处理了该事件(即motion target不为空),则返回true表明此事件已经被处理
如果没有任何一个子view处理了该事件(即motion target不为空),则本view需要进行处理,进入步骤6
查看当前view是否注册了OnTouchListener,如果有,则调用该listener的onTouch函数来处理事件,如果onTouch返回true表示消化处理了该事件,则直接返回true
如果onTouch返回false表示没有处理,则继续调用本view的onTouchEvent函数来处理事件,这里会返回onTouchEvent的返回值
View -& dispatchTouchEvent:
查看当前view是否注册了OnTouchListener,如果有,则调用该listener的onTouch函数来处理事件,如果onTouch返回true表示消化处理了该事件,则直接返回true
如果onTouch返回false表示没有处理,则继续调用本view的onTouchEvent函数来处理事件,这里会返回onTouchEvent的返回值
其他ACTION的处理
上面说了ACTION_DOWN的处理,那ACTION_DOWN后续的ACTION_MOVE,ACTION_UP之类的事件又是怎么处理的呢?它们的处理方式略有不同:
在Activity层面来看,它们的处理和ACTION_DOWN没有区别。
在ViewGroup层面来看,处理开始有了差异:
ViewGroup -& dispatchTouchEvent:
检查当前view在之前处理ACTION_DOWN(ACTION_MOVE,ACTION_UP之类的事件一定是有一个配对的ACTION_DOWN事件在前面发生)的时候是否已经设置了一个motion target
如果有这个target,那么表明之前的ACTION_DOWN事件就是由该子view处理的,此时直接调用motion_target.dispatchTouchEvent
如果没有这个target,那么表明之前的ACTION_DOWN没有任何一个子view处理,那么后续这些事件也不要发给子view了,直接自己处理,进入步骤4
查看当前view是否注册了OnTouchListener,如果有,则调用该listener的onTouch函数来处理事件,如果onTouch返回true表示消化处理了该事件,则直接返回true
如果onTouch返回false表示没有处理,则继续调用本view的onTouchEvent函数来处理事件,这里会返回onTouchEvent的返回值
注意整个流程中都跳过了onInterceptTouchEvent的拦截
在View层面来看,处理方式也是一样的。
所以这里可以看到的现象就是:ACTION_DOWN被谁处理了,后续的ACTION_MOVE,ACTION_UP等事件最终也会交由谁处理。
onTouchEvent() or OnTouchListener.onTouch()?
从上面的内容可以看出来,我们要想对一个触摸事件进行响应,可以在view的onTouchEvent()函数里处理,也可以给view设置一个OnTouchListener然后在listener的onTouch()函数里处理,那么它们有些什么区别?我们应该怎么选择呢?
首先看区别:
onTouchEvent()是View自己的函数,对于我们来说无法override 各种View或者ViewGroup的onTouchEvent()函数,只能是在自己自定义的view里面实现而OnTouchListener的onTouch()是可以对任何View/ViewGroup起作用的,我们只需要在代码里为该View/ViewGroup加一个listener就行
OnTouchListener的onTouch()的执行顺序在view的onTouchEvent()之前,如果在onTouch()函数里面响应完了触摸事件并返回true之后,onTouchEvent()是不会被调用的
知道了区别,那么我们就可以轻易的做出选择了(只是一家之言,欢迎各种不同意见):
OnTouchListener的onTouch()基本上是万能的,任何时候都可以用它,所以大部分时候直接用它就行了
在自定义view里面,如果出于代码结构和功能清晰的目的,可以使用onTouchEvent()
&&&&触摸屏与OLED网推出微信公共平台,每日一条微信新闻,涵盖触摸屏材料、触摸屏设备、触控面板行业主要资讯,第一时间了解触摸屏行业发展动态。关注办法:微信公众号“i51touch” 或微信中扫描下面二维码关注,或
相关阅读:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
地址:成都市高升桥东路2号高盛中心1109室 电话: 028--
版权所有 Copyright(C)
All rights reserved
电子邮件:
业务合作QQ:
触摸屏软件制作与技术支持:
媒体合作QQ:
2000人超级QQ触摸屏群:1220106IOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别
时间: 21:28:58
&&&& 阅读:938
&&&& 评论:
&&&& 收藏:0
标签:触摸事件 在用户使用app过程中,会产生各种各样的事件
一、iOS中的事件可以分为3大类型
触摸事件加速计事件远程控制事件
响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为&响应者对象&
UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件
二、UIResponder
UIResponder内部提供了以下方法来处理事件触摸事件- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)
加速计事件- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)
远程控制事件- (void)remoteControlReceivedWithEvent:(UIEvent *)
三、UIView的触摸事件处理
UIView是UIResponder的子类,可以覆盖下列4个方法处理不同的触摸事件一根或者多根手指开始触摸view,系统会自动调用view的下面方法- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
一根或者多根手指离开view,系统会自动调用view的下面方法- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view的下面方法- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event提示:touches中存放的都是UITouch对象
四、UITouch
当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象
一根手指对应一个UITouch对象
1、UITouch的作用保存着跟手指相关的信息,比如触摸的位置、时间、阶段
当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置
当手指离开屏幕时,系统会销毁相应的UITouch对象
提示:iPhone开发中,要避免使用双击事件!
2、UITouch的属性触摸产生时所处的窗口@property(nonatomic,readonly,retain) UIWindow
触摸产生时所处的视图@property(nonatomic,readonly,retain) UIView
短时间内点按屏幕的次数,可以根据tapCount判断单击、双击或更多的点击@property(nonatomic,readonly) NSUInteger
记录了触摸事件产生或变化时的时间,单位是秒@property(nonatomic,readonly) NSTimeInt
当前触摸事件所处的状态@property(nonatomic,readonly) UITouchP
3、UITouch的方法- (CGPoint)locationInView:(UIView *)返回值表示触摸在view上的位置这里返回的位置是针对view的坐标系的(以view的左上角为原点(0, 0))调用时传入的view参数为nil的话,返回的是触摸点在UIWindow的位置
- (CGPoint)previousLocationInView:(UIView *)该方法记录了前一个触摸点的位置
五、UIEvent
每产生一个事件,就会产生一个UIEvent对象
UIEvent:称为事件对象,记录事件产生的时刻和类型
2、常见属性
事件类型@property(nonatomic,readonly) UIEventT@property(nonatomic,readonly) UIEventS
事件产生的时间@property(nonatomic,readonly) NSTimeI
UIEvent还提供了相应的方法可以获得在某个view上面的触摸对象(UITouch)
3、touches和event参数一次完整的触摸过程,会经历3个状态:触摸开始:- (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
4个触摸事件处理方法中,都有NSSet *touches和UIEvent *event两个参数一次完整的触摸过程中,只会产生一个事件对象,4个触摸方法都是同一个event参数
如果两根手指同时触摸一个view,那么view只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象
如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象
根据touches中UITouch的个数可以判断出是单点触摸还是多点触摸
六、事件的产生和传递
1、发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中
UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)
主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步
找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理touchesBegan&touchesMoved&touchedEnded&
2、事件传递示例
触摸事件的传递是从父控件传递到子控件点击了绿色的view:UIApplication -& UIWindow -& 白色 -& 绿色点击了蓝色的view:UIApplication -& UIWindow -& 白色 -& 橙色 -& 蓝色点击了黄色的view:UIApplication -& UIWindow -& 白色 -& 橙色 -& 蓝色 -& 黄色
如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件(掌握)
如何找到最合适的控件来处理事件?1)自己是否能接收触摸事件?2)触摸点是否在自己身上?3)从后往前遍历子控件数组,重复前面的两个步骤4)如果没有符合条件的子控件,那么就自己最适合处理hitTest方法内部原理(模拟苹果)
// 什么时候调用:只要事件一传递给一个控件就会调用
// 作用:寻找最合适的view给你
// UIApplication -& [UIWindow hitTest:withEvent:]寻找最合适的view告诉系统
// point:当前手指触摸的点
// point:是方法调用者坐标系上的点
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
UIView *fitView = [super hitTest:point withEvent:event];
// 1.判断下窗口能否接收事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha &= 0.01) return
// 2.判断下点在不在窗口上
// 不在窗口上
if ([self pointInside:point withEvent:event] == NO) return
// 3.从后往前遍历子控件数组
int count = (int)self.subviews.
for (int i = count - 1; i &= 0; i--) {
// 获取子控件
UIView *childView = self.subviews[i];
// 坐标系的转换,把窗口上的点转换为子控件上的点
// 把自己控件上的点转换成哪个控件上点
CGPoint childP = [self convertPoint:point toView:childView];
UIView *fitView = [childView hitTest:childP withEvent:event];
if (fitView) {// 如果能找到最合适的view
return fitV
// 4.没有比自己更合适的view
3、UIView不接收触摸事件的三种情况1、不接收用户交互userInteractionEnabled = NO
2、隐藏hidden = YES
3、透明alpha = 0.0 ~ 0.01
提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
七、响应者链条
1、触摸事件处理的详细过程用户点击屏幕后产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件
找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理touchesBegan&touchesMoved&touchedEnded&
这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理
2、响应者链条示意图
响应者链条:是由多个响应者对象连接起来的链条作用:能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理。响应者对象:能处理事件的对象
3、事件传递的完整过程1& 先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件。
2& 调用最合适控件的touches&.方法
3& 如果调用了[super touches&.];就会将事件顺着响应者链条往上传递,传递给上一个响应者
4& 接着就会调用上一个响应者的touches&.方法
4、如何判断上一个响应者1& 如果当前这个view是控制器的view,那么控制器就是上一个响应者
2& 如果当前这个view不是控制器的view,那么父控件就是上一个响应者
5、响应者链的事件传递过程如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理如果window对象也不处理,则其将事件或消息传递给UIApplication对象如果UIApplication也不能处理该事件或消息,则将其丢弃
八、手势识别
1、监听触摸事件的做法如果想监听一个view上面的触摸事件,之前的做法是自定义一个view实现view的touches方法,在方法内部实现具体处理代码
通过touches方法监听view触摸事件,有很明显的几个缺点必须得自定义view由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件不容易区分用户的具体手势行为
iOS 3.2之后,苹果推出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度
2、UIGestureRecognizer为了完成手势识别,必须借助于手势识别器----UIGestureRecognizer
利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势
UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势UITapGestureRecognizer(敲击)UIPinchGestureRecognizer(捏合,用于缩放)UIPanGestureRecognizer(拖拽)UISwipeGestureRecognizer(轻扫)UIRotationGestureRecognizer(旋转)UILongPressGestureRecognizer(长按)
2.1、UITapGestureRecognizer(点按手势)每一个手势识别器的用法都差不多,比如UITapGestureRecognizer的使用步骤如下
创建手势识别器对象UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
设置手势识别器对象的具体属性// 连续敲击2次tap.numberOfTapsRequired = 2;// 需要2根手指一起敲击tap.numberOfTouchesRequired = 2;
添加手势识别器到对应的view上[self.iconView addGestureRecognizer:tap];
监听手势的触发[tap addTarget:self action:@selector(tapIconView:)];
2.2、UILongPressGestureRecognizer(长按手势)
- (void)setUpLongPress
// 长按手势
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[_imageView addGestureRecognizer:longPress];
// 什么时候调用:长按的时候调用,而且只要手指不离开,拖动的时候会一直调用,手指抬起的时候也会调用
- (void)longPress:(UILongPressGestureRecognizer *)longPress
// 注意:在以后开发中,长按手势一般需要做判断
if (longPress.state == UIGestureRecognizerStateEnded) {
NSLog(@"%s",__func__);
2.3、UISwipeGestureRecognizer(轻扫)
- (void)setUpSwipe
// 一个手势只能对应一个方向
// 设置轻扫的方向往右(不设置的话默认为右)
UISwipeGestureRecognizer *swipeR = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
// 设置轻扫的方向
swipeR.direction = UISwipeGestureRecognizerDirectionR
[_imageView addGestureRecognizer:swipeR];
// 设置轻扫的方向往左
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
// 设置轻扫的方向
swipe.direction = UISwipeGestureRecognizerDirectionL
[_imageView addGestureRecognizer:swipe];
- (void)swipe:(UISwipeGestureRecognizer *)swipe
if (swipe.direction == UISwipeGestureRecognizerDirectionRight) {
// 往右边轻扫
// 往左边轻扫
NSLog(@"%s左边",__func__);
3、手势识别的状态
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
// 没有触摸事件发生,所有手势识别的默认状态
UIGestureRecognizerStatePossible,
// 一个手势已经开始但尚未改变或者完成时
UIGestureRecognizerStateBegan,
// 手势状态改变
UIGestureRecognizerStateChanged,
// 手势完成
UIGestureRecognizerStateEnded,
// 手势取消,恢复至Possible状态
UIGestureRecognizerStateCancelled,
// 手势失败,恢复至Possible状态
UIGestureRecognizerStateFailed,
// 识别到手势识别
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 安卓触摸事件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信