您的位置:首页 > 移动开发 > Android开发

Android 手势&触摸事件 MotionEvent

2015-01-15 09:35 447 查看

Android 手势&触摸事件 MotionEvent

1./article/9325989.html这篇相当好啊2.http://blog.csdn.net/android_tutor/article/details/71930903.http://blog.csdn.net/heng615975867/article/details/87919374.http://www.dewen.org/q/2438/
ACTION_MASK在Android中是应用于多点触摸操作,字面上的意思大概是动作掩码的意思吧。
在onTouchEvent(MotionEvent event)中,使用switch (event.getAction())可以处理ACTION_DOWN和ACTION_UP事件;使用switch (event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。
追问
能给我再详细解释下switch (event.getAction() & MotionEvent.ACTION_MASK)和
MotionEvent的一些事件
回答
ACTION_DOWN和ACTION_UP就是单点触摸屏幕,按下去和放开的操作;
ACTION_POINTER_DOWN和ACTION_POINTER_UP就是多点触摸屏幕,当有一只手指按下去的时候,另一只手指按下和放开的动作捕捉;
ACTION_MOVE就是手指在屏幕上移动的操作;
常用的都是这几个吧。
public void onPageScrollStateChanged(int state) {
滚动状态改变时调用。用于发现用户何时开始拖动、页面何时自动沉降到当前页(用户不拖动时)、或者何时完全停止/空闲。
* arg0:新的滚动状态。SCROLL_STATE_DRAGGING、SCROLL_STATE_SETTLING、SCROLL_STATE_IDLE
===================================================================================================2014-2-27号补充: http://developer.android.com/reference/android/view/MotionEvent.html http://developer.android.com/training/gestures/multi.html(官方文档:关于多点触控的)这里有一个系列的文档,和手势有关的还有其它的~非常棒 http://my.eoe.cn/31127/thread http://www.eoeandroid.com/thread-259702-1-1.htmlGestureDetector(OnGestureListener, OnDoubleTapListener, SimpleOnGestureListener)/article/9236571.html/article/5839576.html http://blog.csdn.net/xipiaoyouzi/article/details/7974898 小例子 http://www.2cto.com/kf/201209/156450.html  http://www.cnblogs.com/devinzhang/archive/2012/02/27/2369942.html /article/8906828.htmlhttp://www.icodelogic.com/?p=601 http://www.blogjava.net/TiGERTiAN/archive/2011/02/22/344869.html http://www.linuxidc.com/Linux/2012-06/62567.htm===================================================================================================在刚开始学Android的时候,就觉得Google的文档不咋样,在研究手势时,更加的感觉Google的文档写得实在是太差了。很多常量,属性和方法,居然连个描述都没有。没有描述也就罢了,但是OnGestureListener里手势这么多,它也没有一个介绍说明,在没有进行不断才尝试之前,谁能搞懂onLongPress和onShowPress,onScroll和onFling的关系与差别吗?Google真的需要在文档方面做一次大手术了。不过好在经过鄙人不断反复的尝试。从个人的角度为这几个手势动作做出了定义。按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。长按(onLongPress): 手指按在持续一段时间,并且没有松开。滚动(onScroll): 手指在触摸屏上滑动。按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。抬起(onSingleTapUp):手指离开触摸屏的那一刹那。  除了这些定义之外,鄙人也总结了一点算是经验的经验吧,在这里和大家分享一下。任何手势动作都会先执行一次按下(onDown)动作。长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。Android识别触摸屏手势使得用户体验大大提高。在View类中有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些简单的touch事件,但是这个方法并不能识别手势,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。好在Android为我们提供了GestureDetector类,通过它,我们可以轻松的进行手势识别。下面我做一个简要地介绍。一.GestureDetector简介1.组成GestureDetector类用来识别触摸屏的各种手势,它包含了两个接口和一个内部类:接口:OnGestureListener:用来监听手势事件(6种)。OnDoubleTapListener:用来监听双击事件。内部类:SimpleOnGestureListener:用来监听所有的手势。实际上它实现了上述两个接口,不过方法体是空的,需要我们自己写。我们可以继承这个类,重写里面的方法进行手势处理。2.构造GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener);GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener);GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);3.方法(1)onTouchEvent(MotionEvent ev) 分析捕捉到的触摸事件触发相应的回调函数(2)setIsLongpressEnabled(boolean isLongpressEnabled) 设置“长按”是否可用(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 设置双击监听器4.使用流程:首先,系统捕捉屏幕的触摸事件(onTouchListener),这时还未涉及具体手势,只是简单地捕捉到触摸。接着,在onTouch()方法中调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector来处理最后,还需要实现抽象方法。实现:(1)在Activity中创建GestureDetector实例gestureDetector。(2)可根据需要选择:重写OnGestureListener并通过构造函数传入gestureDetector重写OnDoubleTapListener并通过GestureDetector.setOnDoubleTapListener方法传入gestureDetector重写SimpleOnGestureListener并通过构造函数传入gestureDetector(3)重写Activity的onTouchEvent方法,将所有的触摸事件交给gestureDetector来处理@Overridepublic boolean onTouchEvent(MotionEvent event) {return gestureDetector.onTouchEvent(event);}二.onGestureListener1.onGestureListener识别6种手势,分别是:(1) onDown(MotionEvent e):down事件;(2) onSingleTapUp(MotionEvent e):一次点击up事件;(3) onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该事件;(4) onLongPress(MotionEvent e):长按事件;(5) onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势事件;(6) onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上拖动事件。这里我需要啰嗦在网上搜到的关于onFling和onScroll的一点区别。onFling()是甩,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行,而onScroll(),只要手指移动就会执行。他不会执行MotionEvent.ACTION_UP。onFling通常用来实现翻页效果,而onScroll通常用来实现放大缩小和移动。2.重写OnGestureListener onGestureListener=new OnGestureListener(){@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {return false;}@Overridepublic boolean onLongPress(MotionEvent e) {return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}}可以根据需要,在函数里添加具体的处理方法.之后通过构造函数传入GestureDetector即可。GestureDetector gestureDetector=new GestureDetector(this,onGestureListener);二.OnDoubleTapListener1.OnDoubleTapListener是用来检测鼠标双击事件的。需要实现的抽象方法有:(1) onDoubleTap(MotionEvent e):双击事件。(2) onDoubleTapEvent(MotionEvent e):双击间隔中还发生其他的动作。通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);(3) onSingleTapConfirmed(MotionEvent e):单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。关于onSingleTapConfirmed和onSingleTapUp的一点区别: OnGestureListener有这样的一个方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的区别是:onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。2.重写OnDoubleTapListener onDoubleTapListener new OnDoubleTapListener() {@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {return false;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {return false;}@Overridepublic boolean onDoubleTap(MotionEvent e) {return false;})可以根据需要,在函数里添加具体的处理方法.,之后通过setOnDoubleTapListener传入GestureDetector即可。gestureDetector.setOnDoubleTapListener(onDoubleTapListener) ;三.SimpleOnGestureListenerSimpleOnGestureListener是GestureDetector类的一个内部类,该类是static class,也就是说它实际上是一个外部类。可以在外部继承这个类,重写里面的手势处理方法。1.SimpleOnGestureListener实际上实现了OnGestureListener 和OnDoubleTapListener,所以它可以完成以上提到的所有手势识别(9种),如上介绍。2.重写public class simpleOnGestureListener extends SimpleOnGestureListener {@Overridepublic boolean onDoubleTap(MotionEvent e) {return super.onDoubleTap(e);}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {return super.onDoubleTapEvent(e);}@Overridepublic boolean onDown(MotionEvent e) {return super.onDown(e);}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float x,float y) {return super.onFling(e1, e2, x, y);}@Overridepublic void onLongPress(MotionEvent e) {super.onLongPress(e);}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float x,float y) {return super.onScroll(e1, e2, x, y);}@Overridepublic void onShowPress(MotionEvent e) {super.onShowPress(e);}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {return super.onSingleTapConfirmed(e);}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return super.onSingleTapUp(e);}}可以根据需要,在函数里添加具体的处理方法,之后通过构造函数传入GestureDetector即可。GestureDetector gestureDetector=new GestureDetector(this,simpleOnGestureListener );四.另一种思路要实现捕捉屏幕手势,除了在Activity中创建gestureDetector外,还有一种思路:构建一个Overlay,这个Overlay实现OnGestureListener接口,使其维护自己的GestureDetector。在主视图上添加这个Overlay,并传入相应的listener,即可实现捕捉手势的功能。这2个东西我一直弄不明白,一直蒙蒙的,今天有空,就又看了下,似乎有些懂了,写了测试代码测试了下,但是还是不太明白。参考了这篇文档:http://blog.csdn.net/android_tutor/article/details/7193090。首先,这篇文章仅仅针对于由于触摸(Touch)而触发的事件。Android的事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是ACTION_DOWN, 表示按下了屏幕。之后,touch将会有后续事件,可能是:ACTION_MOVE //表示为移动手势ACTION_UP //表示为离开屏幕ACTION_CANCEL //表示取消手势,不会由用户产生,而是由程序产生的一个Action_DOWN, n个ACTION_MOVE, 1个ACTION_UP,就构成了Android中众多的事件。在Android中,有一类控件是中还可以包含其他的子控件,这类控件是继承于ViewGroup类,例如:ListView, Gallery, GridView。还有一类控件是不能再包含子控件,例如:TextView。本文的主要讨论对象就是ViewGroup类的控件嵌套时事件触发情况。对于ViewGroup类的控件,有一个很重要的方法,就是onInterceptTouchEvent(),用于处理事件并改变事件的传递方向,它的返回值是一个布尔值,决定了Touch事件是否要向它包含的子View继续传递,这个方法是从父View向子View传递。而方法onTouchEvent(),用于接收事件并处理,它的返回值也是一个布尔值,决定了事件及后续事件是否继续向上传递,这个方法是从子View向父View传递。touch事件在 onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。返回值为true表示事件被正确接收和处理了,返回值为false表示事件没有被处理,将继续传递下去。ACTION_DOWN事件会传到某个ViewGroup类的onInterceptTouchEvent,如果返回false,则DOWN事件继续向子ViewGroup类的onInterceptTouchEvent传递,如果子View不是ViewGroup类的控件,则传递给它的onTouchEvent。如果onInterceptTouchEvent返回了true,则DOWN事件传递给它的onTouchEvent,不再继续传递,并且之后的后续事件也都传递给它的onTouchEvent。如果某View的onTouchEvent返回了false,则DOWN事件继续向其父ViewGroup类的onTouchEvent传递;如果返回了true,则后续事件会直接传递给其onTouchEvent继续处理。(后续事件只会传递给对于必要事件ACTION_DOWN返回了true的onTouchEvent)总结一下就是:onInterceptTouchEvent可以接受到所有的Touch事件,而onTouchEvent则不一定。 http://hao3100590.iteye.com/blog/1267294  http://blog.csdn.net/liutao5757124/article/details/6097125  http://wenku.baidu.com/view/bcd001c608a1284ac850430c.html  http://www.2cto.com/kf/201109/104205.html MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的传递顺序 http://www.cnblogs.com/kingcent/archive/2011/03/08/1977064.html  http://glason.diandian.com/post/2011-12-19/12743121  http://www.cnblogs.com/kingcent/archive/2011/03/08/1977064.html  http://wenku.baidu.com/view/bcd001c608a1284ac850430c.html  http://blog.csdn.net/ddna/article/details/5473293  http://blog.csdn.net/ddna/article/details/5451722  http://blog.csdn.net/G_rrrr/article/details/4861189 官方文档翻译:/article/1802205.html转载地址:/article/9325989.html
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: