1. 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的,因此这个类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener,SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,这个类实现了上述两个接口(但是所有的方法体都是空的),该类是static class,也就是说它实际上是一个外部类。程序员可以在外部继承这个类,重写里面的手势处理方法。

通过GestureDetector的构造方法可以将SimpleOnGestureListener对象传递进去,这样GestureDetector能处理不同的手势了。

2. 具体用法:

2.1

  1. private class DefaultGestureListener extends SimpleOnGestureListener{
  2.  
  3. @Override
  4. public boolean onSingleTapUp(MotionEvent e) {
  5. return false;
  6. }
  7.  
  8. @Override
  9. public void onLongPress(MotionEvent e) {
  10.  
  11. }
  12. /**
  13. * @param e1 The first down motion event that started the scrolling.
  14. @param e2 The move motion event that triggered the current onScroll.
  15. @param distanceX The distance along the X axis(轴) that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.
  16. @param distanceY The distance along the Y axis that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.
  17. 无论是用手拖动view,或者是以抛的动作滚动,都会多次触发 ,这个方法在ACTION_MOVE动作发生时就会触发 参看GestureDetector的onTouchEvent方法源码
  18. * */
  19. @Override
  20. public boolean onScroll(MotionEvent e1, MotionEvent e2,
  21. float distanceX, float distanceY) {
  22. return false;
  23. }
  24. /**
  25. * @param e1 第1个ACTION_DOWN MotionEvent 并且只有一个
  26. * @param e2 最后一个ACTION_MOVE MotionEvent
  27. * @param velocityX X轴上的移动速度,像素/秒
  28. * @param velocityY Y轴上的移动速度,像素/秒
  29. * 这个方法发生在ACTION_UP时才会触发 参看GestureDetector的onTouchEvent方法源码
  30. *
  31. * */
  32. @Override
  33. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  34. float velocityY) {
  35. return false;
  36. }
  37.  
  38. @Override
  39. public void onShowPress(MotionEvent e) {
  40.  
  41. }
  42. @Override
  43. public boolean onDown(MotionEvent e) {
  44. return false;
  45. }
  46. @Override
  47. public boolean onDoubleTap(MotionEvent e) {
  48. return false;
  49. }
  50. @Override
  51. public boolean onDoubleTapEvent(MotionEvent e) {
  52. return false;
  53. },也就是不是“双击”的时候触发
  54. * */
  55. @Override
  56. public boolean onSingleTapConfirmed(MotionEvent e) {
  57. return false;
  58. }
  59.  
  60. }

2.2

  1. public GestureDetector (Context context, GestureDetector.OnGestureListener listener)通过构造方法将手势响应交给手势识别类

2.3

在OnTouchListener的onTouch方法中

  1. private OnTouchListener gestureTouchListener = new OnTouchListener() {
  2. @Override
  3. public boolean onTouch(View v, MotionEvent event) {
  4. return gDetector.onTouchEvent(event);
  5. }
  6. };

ok,到此为止就结束了

遇到的问题:

1. onFling(***)无法触发

通过设置 mListView.setLongClickable(true);即可(我处理的是ListView的手势事件),只有这样,view才能够处理不同于Tap(轻触)的hold(即ACTION_MOVE,或者多个ACTION_DOWN),我们同样可以通过layout定义中的android:longClickable来做到这一点。

2. 用户长按手机屏幕,就会触发长按事件,离开屏幕时,就会触发up事件,但是SimpleOnGestureListener没有对longPress事件的up事件对外提供接口

解决办法:

类似于这样,截获up事件,因为所有的都是有OnTouchListener 先获得,然后传递给SimpleOnGestureListener的,这里有一点必须要注意:

截获到up事件,我们进行了处理后,必须要将这个事件再交给SimpleOnGestureListener处理,虽然我们只截获长按事件的up,但是SimpleOnGestureListener对于长按事件的up也做了一些处理,只是没有对外提供接口。

做了什么处理:

if (mInLongPress) {
                mHandler.removeMessages(TAP);
                mInLongPress = false;

}

如果不交给SimpleOnGestureListener处理,那么单击动作也会触发onLongPress方法。

private OnTouchListener gestureTouchListener = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return gDetector.onTouchEvent(event);
           case MotionEvent.ACTION_UP:
                MyGesture.FlagInfo info = mGesture.getFlagInfo();
                if(info.isConnected==true){
                    int firstVisiblePosition = mListView.getFirstVisiblePosition();
                    View view = mListView.getChildAt(info.position-firstVisiblePosition);
                    if(view!=null){
                        view.setBackgroundResource(R.drawable.listitem_background_blue);
                        info.isConnected = false;
                    }
                }
                return gDetector.onTouchEvent(event);
            case MotionEvent.ACTION_MOVE:
                return gDetector.onTouchEvent(event);
            }
            return false;
            
        }
    };

总结:

  1. . 点击屏幕上的某项的执行流程 有两种情况,一种是时间很短,一种时间稍长
  2.  
  3. 时间很短:onDown--------》onSingleTapUp--------》onSingleTapConfirmed
  4.  
  5. 时间稍长:onDown--------》onShowPress------》onSingleTapUp--------》onSingleTapConfirmed
  6.  
  7. . 长按事件
  8.  
  9. onDown--------》onShowPress------》onLongPress
  10.  
  11. .抛:手指触动屏幕后,稍微滑动后立即松开
  12.  
  13. onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
  14.  
  15. .拖动
  16.  
  17. onDown------》onScroll----》onScroll------》onFiling
  18.  
  19. 注意:有的时候会触发onFiling,但是有的时候不会触发,个人理解是人的动作不标准所致。

GestureDetector和SimpleOnGestureListener的使用教程的更多相关文章

  1. 【Andorid------手势识别】GestureDetector和SimpleOnGestureListener的使用教程(转)——

    FROM:http://www.cnblogs.com/transmuse/archive/2010/12/02/1894833.html 1. 当用户触摸屏幕的时候,会产生许多手势,例如down,u ...

  2. Android触控屏幕Gesture(GestureDetector和SimpleOnGestureListener的使用教程)

    1.当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vie ...

  3. Android触控屏幕Gesture(GestureDetector和SimpleOnGestureListener的使用教程) 分类:Androidandroid实例

    1.当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(Vie ...

  4. Android L(5.0)源码之手势识别GestureDetector

    本人新手,最近下了Android L的源码,正在研究手势识别,能力有限,现总结如下: Android识别触摸屏手势使得用户体验大大提高.在View类中有个View.OnTouchListener内部接 ...

  5. Android手势监听类GestureDetector的使用

    在使用自定义视图的时候,对触屏事件的处理是比不可少的,有能力的可以自己写代码处理,这样更加的灵活.如果不想这么麻烦,Android提供了一个手势监听类GestureDetector,可以供我们使用.G ...

  6. Android 手势&触摸事件 MotionEvent

    1.http://blog.csdn.net/omg_2012/article/details/7881443 这篇相当好啊 2.http://blog.csdn.net/android_tutor/ ...

  7. Android 手势&触摸事件

    在刚开始学Android的时候,就觉得Google的文档不咋样,在研究手势时,更加的感觉Google的文档写得实在是太差了.很多常量,属性和方法,居然连个描述都没有. 没有描述也就罢了,但是OnGes ...

  8. GridView实现拖拽排序以及数据交互

    在研究项目中的一个效果的时候,查找资料过程中发现有人有这么一种需求,就是GridView在实现拖拽排序的基础上,如果是两个GridView之间实现拖拽效果,并要实现数据交互. 一.效果图: 实现这个效 ...

  9. 手势识别官方教程(6)识别拖拽手势用GestureDetector.SimpleOnGestureListener和onTouchEvent

    三种现实drag方式 1,在3.0以后可以直接用 View.OnDragListener (在onTouchEvent中调用某个view的startDrag()) 2,onTouchEvent()  ...

随机推荐

  1. vbox安装mac os x

    http://zhiwei.li/text/2013/12/%E5%9C%A8virtualbox4-3-4%E4%B8%AD%E5%AE%89%E8%A3%85mavericks/ http://g ...

  2. python在一个列表中查找

    # -*- coding: utf-8 -*-__author__ = 'Administrator'import bisect#简化一些操作#1:在一个列表中查找""" ...

  3. python高级编程之我不测试

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#测试驱动开发(高级编程处学习,第11章)#测试驱动开发也叫TDD, 是制造高质量软件的一种简单技 ...

  4. (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(2)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第六章译文精选的第二部分,其余章节将陆续放出.上一 ...

  5. class 类(2)

    类属性和实例属性 一个类实例化后,实例是一个对象,有属性.同样,类也是一个对象,它也有属性. >>> class A(object): ... x = 7 ... >>& ...

  6. 浅谈管道模型(Pipeline)

    本篇和大家谈谈一种通用的设计与处理模型--Pipeline(管道). Pipeline简单介绍 Pipeline模型最早被使用在Unix操作系统中.据称,假设说Unix是计算机文明中最伟大的发明,那么 ...

  7. windows下netstat -aon命令

    windows平台下netstat常用命令 C:\Users\Administrator>netstat --help 显示协议统计和当前 TCP/IP 网络连接. NETSTAT [-a] [ ...

  8. 用SNMP协议实现系统信息监控--CentOS

    (1)  安装SNMP客户端以及服务端 安装内容为三项:net-snmp  net-snmp-devel   net-snmp-utils 安装命令:yum install net-snmp net- ...

  9. js过滤

    datagrid:                loadFilter: function (data) {                    return loadFilter(data);   ...

  10. SqlCommand和SqlDataAdapter有什么区别

    因为DataSet是离线的,所以SqlDataAdapter这个对象是连接DataSet和数据库的桥梁,所有对DataSet的操作(填充,更新等)都要通过他 ado.net数据访问有两种方式: 1.离 ...