1.http://blog.csdn.net/omg_2012/article/details/7881443

这篇相当好啊

2.http://blog.csdn.net/android_tutor/article/details/7193090

3.http://blog.csdn.net/heng615975867/article/details/8791937

4.http://www.dewen.org/q/2438/


  1. ACTION_MASKAndroid中是应用于多点触摸操作,字面上的意思大概是动作掩码的意思吧。
    onTouchEvent(MotionEvent event)中,使用switch (event.getAction())能够处理ACTION_DOWNACTION_UP事件;使用switch (event.getAction() & MotionEvent.ACTION_MASK)就能够处理处理多点触摸的ACTION_POINTER_DOWNACTION_POINTER_UP事件。
追问
  1. 能给我再详解下switch (event.getAction() & MotionEvent.ACTION_MASK)和
    MotionEvent的一些事件
回答
  1. ACTION_DOWNACTION_UP就是单点触摸屏幕,按下去和放开的操作;
    ACTION_POINTER_DOWNACTION_POINTER_UP就是多点触摸屏幕,当有一仅仅手指按下去的时候,还有一仅仅手指按下和放开的动作捕捉;
    ACTION_MOVE就是手指在屏幕上移动的操作;
    经常使用的都是这几个吧。

  1. public void onPageScrollStateChanged(int state) {
    滚动状态改变时调用。用于发现用户何时開始拖动、页面何时自己主动沉降到当前页(用户不拖动时)、或者何时全然停止/空暇。 
    * arg0:新的滚动状态。SCROLL_STATE_DRAGGINGSCROLL_STATE_SETTLINGSCROLL_STATE_IDLE

===================================================================================================

2014-2-27号补充:

这里有一个系列的文档,和手势有关的还有其他的~很棒
http://my.eoe.cn/31127/thread

http://www.eoeandroid.com/thread-259702-1-1.html


GestureDetector(OnGestureListener, OnDoubleTapListener, SimpleOnGestureListener)





小样例








===================================================================================================

在刚開始学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来处理

@Override

public boolean onTouchEvent(MotionEvent event) {

return gestureDetector.onTouchEvent(event);

}

二.onGestureListener

1.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(){

@Override

public boolean onDown(MotionEvent e) {

return false;

}

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2,

float velocityX, float velocityY) {

return false;

}

@Override

public boolean onLongPress(MotionEvent e) {

return false;

}

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2,

float distanceX, float distanceY) {

return false;

}

@Override

public void onShowPress(MotionEvent e) {

}

@Override

public boolean onSingleTapUp(MotionEvent e) {

return false;

}

}

能够依据须要,在函数里加入详细的处理方法.之后通过构造函数传入GestureDetector就可以。

GestureDetector gestureDetector=new GestureDetector(this,onGestureListener);

二.OnDoubleTapListener

1.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,和onSingleTapConfirmedeasy混淆。

二者的差别是:onSingleTapUp,仅仅要手抬起就会运行,而对于onSingleTapConfirmed来说,假设双击的话,则onSingleTapConfirmed不会运行。

2.重写

OnDoubleTapListener onDoubleTapListener new OnDoubleTapListener() {

@Override

public boolean onSingleTapConfirmed(MotionEvent e) {

return false;

}

@Override

public boolean onDoubleTapEvent(MotionEvent e) {

return false;

}

@Override

public boolean onDoubleTap(MotionEvent e) {

return false;

}

)

能够依据须要,在函数里加入详细的处理方法.,之后通过setOnDoubleTapListener传入GestureDetector就可以。

gestureDetector.setOnDoubleTapListener(onDoubleTapListener) ;

三.SimpleOnGestureListener

SimpleOnGestureListener是GestureDetector类的一个内部类,该类是static class,也就是说它实际上是一个外部类。能够在外部继承这个类,重写里面的手势处理方法。

1.SimpleOnGestureListener实际上实现了OnGestureListener 和OnDoubleTapListener,所以它能够完毕以上提到的全部手势识别(9种),如上介绍。

2.重写

public class simpleOnGestureListener extends SimpleOnGestureListener {

@Override

public boolean onDoubleTap(MotionEvent e) {

return super.onDoubleTap(e);

}

@Override

public boolean onDoubleTapEvent(MotionEvent e) {

return super.onDoubleTapEvent(e);

}

@Override

public boolean onDown(MotionEvent e) {

return super.onDown(e);

}

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float x,

float y) {

return super.onFling(e1, e2, x, y);

}

@Override

public void onLongPress(MotionEvent e) {

super.onLongPress(e);

}

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2, float x,

float y) {

return super.onScroll(e1, e2, x, y);

}

@Override

public void onShowPress(MotionEvent e) {

super.onShowPress(e);

}

@Override

public boolean onSingleTapConfirmed(MotionEvent e) {

return super.onSingleTapConfirmed(e);

}

@Override

public 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



官方文档翻译:

http://blog.csdn.net/iefreer/article/details/4586351

Android 手势&触摸事件 MotionEvent的更多相关文章

  1. Android触摸事件MotionEvent详解

    触摸事件MotionEvent在用户交互中,占着非常重要的地位.首先,来看看MotionEvent中封装的一些常用的事件常量,它定义了触摸事件的不同类型. 1.单点触摸按下动作 public stat ...

  2. 触摸事件MotionEvent

    触摸事件MotionEvent在用户交互中,占着非常重要的地位.首先,来看看MotionEvent中封装的一些常用的事件常量,它定义了触摸事件的不同类型. 1.单点触摸按下动作 public stat ...

  3. Android: 详解触摸事件如何传递

    当视图的层次结构比较复杂的时候,触摸事件的响应流程也变得复杂. 举例来说,你也许有一天想要制作一个手势极其复杂的 Activity 来折磨你的用户,你经过简单思索,认为其中应该包含一个 PageVie ...

  4. Android ViewGroup拦截触摸事件具体解释

    前言 在自己定义ViewGroup中.有时候须要实现触摸事件拦截.比方ListView下拉刷新就是典型的触摸事件拦截的样例. 触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其ch ...

  5. Android学习笔记触摸事件

    案例代码: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <Relativ ...

  6. Android处理各种触摸事件

    Android里有两个类 android.view.GestureDetector android.view.GestureDetector.SimpleOnGestureListener (另外 a ...

  7. 触摸事件【MotionEvent】简介

    MotionEvent简介 当用户触摸屏幕时,将创建一个MontionEvent对象,MotionEvent包含了关于发生触摸的位置.时间信息,以及触摸事件的其他很多细节. Android 将所有的输 ...

  8. Android触摸事件流程剖析

    Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段: onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递 onTouchEvent触摸事件处 ...

  9. Android学习之触点事件的处理

    知识点: 1. Android开发中的运动事件:触摸屏(TouchScreen)和滚动球(TrackBall) 2.对运动事件的处理:MotionEvent 3.触摸时必发的三个MotionEvent ...

随机推荐

  1. poj 1155 TELE (树形背包dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...

  2. Xcode4 布置Git环境Your working copy is out of date. Try pulling from the remote to get the latest change

    今天布置环境的时候发现一个问题:Your working copy is out of date. Try pulling from the remote to get the latest chan ...

  3. BZOJ 1257: [CQOI2007]余数之和sum( 数论 )

    n >= k 部分对答案的贡献为 k * (n - k) n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i)  = ∑  , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连 ...

  4. MySql连接问题

    今天想通过命令连接到另外一台主机的Mysql 命令: mysql -h ip -u username -p EnterPassWord: password 连接成功

  5. Hystrix 使用与分析

    转载请注明出处哈:http://hot66hot.iteye.com/admin/blogs/2155036 一:为什么需要Hystrix? 在大中型分布式系统中,通常系统很多依赖(HTTP,hess ...

  6. MySQL推出Applier,可实时复制数据到Hadoop

    MySQL复制操作可以将数据从一个MySQL服务器(主)复制到其他的一个或多个MySQL服务器(从).试想一下,如果从服务器不再局限为一个MySQL服务器,而是其他任何数据库服务器或平台,并且复制事件 ...

  7. <?php echo "我的第一段 PHP 脚本!"; ?>

    <!DOCTYPE html><html><body> <?phpecho "我的第一段 PHP 脚本!";?> </body ...

  8. svn 标示提示

    原来没有遇到过, 突然发现这次写的项目有几个文件时 这个"表示的" ,死活找不到原因,并且提交,改动 都好烦人,还要锁定什么嘛的. 最后最终知道, 这个意思是  文件的状态为 &q ...

  9. gcc configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0

    从svn checkout svn://gcc.gnu.org/svn/gcc/trunk拿了GCC的最新代码,打算编译了学东西习学习C++ 11的东西,结果在configure的时候出现例如以下问题 ...

  10. Swift - 使用CATransition制作过渡动画(页面切换转场效果)

    CATransition动画主要在过渡时使用,比如两个页面层级改变的时候添加一个转场效果.CATransition分为两类,一类是公开的动画效果,一类是非公开的动画效果. 1,公开动画效果: kCAT ...