欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android触摸及手势操作GestureDetector

程序员文章站 2024-03-05 12:37:54
现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘、无鼠标的手机系统带来了很多的便利。当用户触摸屏幕时会产生很多的触摸事件,d...

现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘、无鼠标的手机系统带来了很多的便利。当用户触摸屏幕时会产生很多的触摸事件,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呢,官方的是这样解释的:

Android触摸及手势操作GestureDetector

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

Android触摸及手势操作GestureDetector   

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);
   }
  });

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