zoukankan      html  css  js  c++  java
  • 【Android】关于手势识别(TouchEvent/Gesture)

    我们在很多应用中会用到Android的手势识别,比如单击,长按,滑动等等,这时候就需要我们监听用户的触摸事件。在实现这个功能的时候,有两个接口看上去有点像:OnTouchEvent和OnGestureListener。(我好像一直比较误会)

    假设一个类实现了OnGestureListener接口,那么它需要实现的方法如下:

     1 import android.app.Activity;
     2 import android.view.GestureDetector.OnGestureListener;
     3 import android.view.MotionEvent;
     4 
     5 public class Test extends Activity implements OnGestureListener{
     6 
     7     @Override
     8     public boolean onDown(MotionEvent arg0) {
     9         // TODO Auto-generated method stub
    10         return false;
    11     }
    12 
    13     @Override
    14     public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
    15             float arg3) {
    16         // TODO Auto-generated method stub
    17         return false;
    18     }
    19 
    20     @Override
    21     public void onLongPress(MotionEvent arg0) {
    22         // TODO Auto-generated method stub
    23         
    24     }
    25 
    26     @Override
    27     public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
    28             float arg3) {
    29         // TODO Auto-generated method stub
    30         return false;
    31     }
    32 
    33     @Override
    34     public void onShowPress(MotionEvent arg0) {
    35         // TODO Auto-generated method stub
    36         
    37     }
    38 
    39     @Override
    40     public boolean onSingleTapUp(MotionEvent arg0) {
    41         // TODO Auto-generated method stub
    42         return false;
    43     }
    44 }

    假设一个类实现接口OnTouchEvent,它需要实现的方法如下:

     1 import android.app.Activity;
     2 import android.view.MotionEvent;
     3 import android.view.View;
     4 import android.view.View.OnTouchListener;
     5 
     6 public class Test extends Activity implements OnTouchListener{
     7 
     8     @Override
     9     public boolean onTouch(View arg0, MotionEvent arg1) {
    10         // TODO Auto-generated method stub
    11         return false;
    12     }
    13 
    14 }

    在这里只要实现一个方法,OnTouch(View v ,Event e) 两个参数 v和 e都是系统自动传进来的,这个v取决于你当前点击的view对象,e代表你当前点事件的各个属性(比如坐标,按下,放开,移动,等等)。这里有两个地方值得看一下:

    1)return false和return true有什么区别?

    根据Android开发者文档的描述:true if the GestureDetector.OnGestureListener consumed the event, else false.(我找的是GestureDetector)所以true表明事件已经被消化了,否则的话就是false(事件依旧存在)

    2)这里写的是onTouch方法必须要被重载,而这个方法里面有两个参数,在开发者文档上写的是:

    v     The view the touch event has been dispatched to.(事件被分发到的view,也就是促发事件的组件)

    event  The MotionEvent object containing full information about the event.(包含了事件发生的足够多的信息)

    但是问题是我们在网上看到的很多的例子,都不是使用这里的event获取事件信息的,而是重载了另外一个方法OnTouchEvent。onTouchEvent同样是在View中定义的一个方法。处理传递到view 的手势事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL四种事件。一般通过前三种事件类型来观察用户的动作情况,那么这两者有什么区别呢?开发者文档对这个方法的描述如下:

    Implement this method to handle touch screen motion events.

    event   the motion event

    returns: True if the event was handled, false otherwise.

    关键是两个event都是MotionEvent类型的,可以获取和事件相关的一切信息,所以这两个是不是么有区别??

    下面又要综合几篇博客做论述了:

    1)Android onTouchEvent, onClick及onLongClick的调用机制

    2)消息分发知识基础

    OnTouchListener:onTouch和onTouchEvent 的区别

    • 首先执行OnTouchListener()中的onTouch,然后执行重写的onTouchEvent(MotionEvent event)。(注:在return不为true的情况下)
    • onTouch() is used by users of the View to get touch events while onTouchEvent() is used by derived classes of the View to get touch events.

    所以onTouch是view用来获取事件类型的,而onTouchEvent则是用来被派生类获取时间类型的。

  • 相关阅读:
    虚拟机下linux系统安装spark一个小提示
    寒假学习记录第七天
    寒假学习记录第六天
    寒假学习记录第五天
    快捷键
    yum安装软件内容
    常见问题处理
    linux目录详解
    linux三剑客
    linux符号与正则表达式
  • 原文地址:https://www.cnblogs.com/lqminn/p/2701001.html
Copyright © 2011-2022 走看看