Android触摸及手势操作GestureDetector

 更新时间:2016年07月28日 16:13:46   作者:xyz_lmn  
这篇文章主要a为大家详细介绍了Android触摸及手势操作GestureDetector的相关资料,感兴趣的小伙伴们可以参考一下

现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘、无鼠标的手机系统带来了很多的便利。当用户触摸屏幕时会产生很多的触摸事件,down、up、move等等。View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,如下:

public class MainActivity extends Activity {
...
// This example shows an Activity, but you would use the same approach if
// you were subclassing a View.
@Override
public boolean onTouchEvent(MotionEvent event){ 
  
 int action = MotionEventCompat.getActionMasked(event);
  
 switch(action) {
  case (MotionEvent.ACTION_DOWN) :
   Log.d(DEBUG_TAG,"Action was DOWN");
   return true;
  case (MotionEvent.ACTION_MOVE) :
   Log.d(DEBUG_TAG,"Action was MOVE");
   return true;
  case (MotionEvent.ACTION_UP) :
   Log.d(DEBUG_TAG,"Action was UP");
   return true;
  case (MotionEvent.ACTION_CANCEL) :
   Log.d(DEBUG_TAG,"Action was CANCEL");
   return true;
  case (MotionEvent.ACTION_OUTSIDE) :
   Log.d(DEBUG_TAG,"Movement occurred outside bounds " +
     "of current screen element");
   return true;  
  default : 
   return super.onTouchEvent(event);
 }  
}

OnTouch提供的事件还是相对较简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦,因为我们要根据用户触摸的轨迹去判断是什么手势。Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势。

public class GestureDetector extends Object 
java.lang.Object
android.view.GestureDetector

GestureDetector属于android.view包,android还提供了android.gesture包支持更多的手势操作,以后我们会介绍到。官方的介绍中使用了GestureDetectorCompat处理手势识别,为什么使用GestureDetectorCompat替换了GestureDetector呢,官方的是这样解释的:

 GestureDetectorCompat实例化有下面两种方法:

   

GestureDetector类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,还有一个内部类SimpleOnGestureListener;SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,它实现了上述两个接口,该类是static class,也就是说它实际上是一个外部类,我们可以在外部继承这个类,重写里面的手势处理方法。因此实现手势识别有两种方法,一种实现OnGestureListener接口,另一种是使用SimpleOnGestureListener类。

OnGestureListener有下面的几个动作:

按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。

抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。

长按(onLongPress): 手指按在持续一段时间,并且没有松开。

滚动(onScroll): 手指在触摸屏上滑动。

按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。

抬起(onSingleTapUp):手指离开触摸屏的那一刹那。

使用OnGestureListener接口,这样需要重载OnGestureListener接口所有的方法,适合监听所有的手势,正如官方文档提到的“Detecing All Supported Gestures”。

public class MainActivity extends Activity implements 
  GestureDetector.OnGestureListener,
  GestureDetector.OnDoubleTapListener{
 
 private static final String DEBUG_TAG = "Gestures";
 private GestureDetectorCompat mDetector; 

 // Called when the activity is first created. 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  // Instantiate the gesture detector with the
  // application context and an implementation of
  // GestureDetector.OnGestureListener
  mDetector = new GestureDetectorCompat(this,this);
  // Set the gesture detector as the double tap
  // listener.
  mDetector.setOnDoubleTapListener(this);
 }

 @Override 
 public boolean onTouchEvent(MotionEvent event){ 
  this.mDetector.onTouchEvent(event);
  // Be sure to call the superclass implementation
  return super.onTouchEvent(event);
 }

 @Override
 public boolean onDown(MotionEvent event) { 
  Log.d(DEBUG_TAG,"onDown: " + event.toString()); 
  return true;
 }

 @Override
 public boolean onFling(MotionEvent event1, MotionEvent event2, 
   float velocityX, float velocityY) {
  Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
  return true;
 }

 @Override
 public void onLongPress(MotionEvent event) {
  Log.d(DEBUG_TAG, "onLongPress: " + event.toString()); 
 }

 @Override
 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
   float distanceY) {
  Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString());
  return true;
 }

 @Override
 public void onShowPress(MotionEvent event) {
  Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
 }

 @Override
 public boolean onSingleTapUp(MotionEvent event) {
  Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
  return true;
 }

 @Override
 public boolean onDoubleTap(MotionEvent event) {
  Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
  return true;
 }

 @Override
 public boolean onDoubleTapEvent(MotionEvent event) {
  Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
  return true;
 }

 @Override
 public boolean onSingleTapConfirmed(MotionEvent event) {
  Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
  return true;
 }
}

 这样会造成有些手势动作我们用不到,但是还要重载。SimpleOnGestureListener类的出现为我们解决了这个问题,如果你想“Detecting a Subset of Supported Gestures”,SimpleOnGestureListener是最好的选择。

public class MainActivity extends Activity { 
 
 private GestureDetectorCompat mDetector; 

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mDetector = new GestureDetectorCompat(this, new MyGestureListener());
 }

 @Override 
 public boolean onTouchEvent(MotionEvent event){ 
  this.mDetector.onTouchEvent(event);
  return super.onTouchEvent(event);
 }
 
 class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
  private static final String DEBUG_TAG = "Gestures"; 
  
  @Override
  public boolean onDown(MotionEvent event) { 
   Log.d(DEBUG_TAG,"onDown: " + event.toString()); 
   return true;
  }

  @Override
  public boolean onFling(MotionEvent event1, MotionEvent event2, 
    float velocityX, float velocityY) {
   Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
   return true;
  }
 }
}

最后了我们也解释两个问题:

1、onTouchEvent中为什么使用了MotionEventCompat,而不直接使用MotionEvent。因为MotionEventCompat使更多的Action适配到API 4。

2、Android的view怎么使用手势,方法如下:

View myView = findViewById(R.id.my_view); 
  myView.setOnTouchListener(new OnTouchListener() {
   public boolean onTouch(View v, MotionEvent event) {
    // ... Respond to touch events  
   this.mDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
   }
  });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Android AsyncTask内存安全的一种使用方式

    浅谈Android AsyncTask内存安全的一种使用方式

    这篇文章主要介绍了浅谈Android AsyncTask内存安全的一种使用方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Android TextView实现垂直滚动效果的方法

    Android TextView实现垂直滚动效果的方法

    这篇文章主要介绍了Android TextView实现垂直滚动效果的方法,结合实例形式简单分析了Android TextView控件垂直滚动效果的相关属性功能与设置技巧,需要的朋友可以参考下
    2016-10-10
  • Android UI设计系列之HTML标签实现TextView设置中文字体加粗效果(6)

    Android UI设计系列之HTML标签实现TextView设置中文字体加粗效果(6)

    这篇文章主要介绍了Android UI设计系列之使用HTML标签,实现在TextView中对中文字体加粗的效果,具有一定的实用性和参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android转场效果实现示例浅析

    Android转场效果实现示例浅析

    这篇文章主要为大家介绍了Android转场效果实现示例浅析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Android实现View滑动的几种方式

    Android实现View滑动的几种方式

    Android中的View类是所有UI控件的基类(Base class),也就是说我们平时所有到的各种UI控件,比如Button、ImagView等等都继承自View类。这篇文章主要为大家详细介绍了Android实现View滑动的几种方式,需要的朋友可以参考下
    2016-04-04
  • Android动画学习笔记之补间动画

    Android动画学习笔记之补间动画

    这篇文章主要为大家详细介绍了Android动画学习笔记之补间动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • android弹出activity设置大小的方法

    android弹出activity设置大小的方法

    本篇文章介绍了android弹出activity设置大小的方法,需要的朋友可以参考一下
    2013-06-06
  • Android使用Intent隐式实现页面跳转

    Android使用Intent隐式实现页面跳转

    这篇文章主要为大家详细介绍了Android使用Intent隐式来实现向上跳转,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android仿微信语音消息的录制和播放功能

    Android仿微信语音消息的录制和播放功能

    这篇文章主要介绍了Android仿微信语音消息的录制和播放功能,需要的朋友可以参考下
    2017-09-09
  • Android 图片显示与屏幕适配的问题

    Android 图片显示与屏幕适配的问题

    这篇文章主要介绍了Android 图片显示与屏幕适配的问题的相关资料,Android的分辨率问题是每个Android 开发者头疼的问题,那么这里给大家介绍个万能办法,需要的朋友可以参考下
    2017-08-08

最新评论