首页 > 代码库 > Android的编程学习笔记——手势编程初探(GestureDetector)

Android的编程学习笔记——手势编程初探(GestureDetector)

Android sdk给我们提供了GestureDetector类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。

GestureDetector提供了两个接口:OnGestrueListener、OnDoubleTapListener,从接口的名称来看,前者是手势监听器,后者是双击手势监听器。

OnGestureListener接口含有6个回调方法:

1、onDown(MotionEvent e)

2、onSingleTapUp(MotionEvent e)

3、onShowPress(MotionEvent e)

4、onLongPress(MotionEvent e)

5、onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

6、onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)

OnDoubleTapListener接口含有3个回调方法:

1、onDoubleTap(MotionEvent e)

2、onDoubleTapEvent(MotionEvent e)

3、onSingleTapConfirmed(MotionEvent e)

为使手势编程更加简洁,Android SDK提供了SimpleOnGestureListener这个内部类,它继承了OnGestureListenerOnDoubleTapListener两个接口,并实现了所有的回调方法,只不过方法体为空,需要程序员在应用程序中重写需要的方法。

以下用一个程序实例来演示SimpleOnGestureListener的用法,以及各回调方法的效果。实例程序界面放置了TextView用来显示屏幕触摸事件的坐标、位移、速度等信息。

  • 界面XML文件代码(activity_gesture_test.xml)
  1 <?xml version="1.0" encoding="utf-8"?>  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3     android:id="@+id/container"  4     android:layout_width="match_parent"  5     android:layout_height="match_parent"  6     android:orientation="vertical" >  7   8     <LinearLayout  9         android:layout_width="fill_parent" 10         android:layout_height="wrap_content" 11         android:orientation="horizontal" > 12  13         <LinearLayout 14             android:layout_width="0dp" 15             android:layout_height="wrap_content" 16             android:layout_weight="1" 17             android:background="#ccc" 18             android:orientation="vertical" > 19  20             <TextView 21                 android:id="@+id/showX" 22                 android:layout_width="fill_parent" 23                 android:layout_height="wrap_content" 24                 android:text="X:" /> 25  26             <TextView 27                 android:id="@+id/showY" 28                 android:layout_width="fill_parent" 29                 android:layout_height="wrap_content" 30                 android:text="Y:" /> 31         </LinearLayout> 32  33         <LinearLayout 34             android:layout_width="0dp" 35             android:layout_height="wrap_content" 36             android:layout_weight="1" 37             android:background="#ddd" 38             android:orientation="vertical" > 39  40             <TextView 41                 android:id="@+id/showXV" 42                 android:layout_width="fill_parent" 43                 android:layout_height="wrap_content" 44                 android:text="XV:" /> 45  46             <TextView 47                 android:id="@+id/showYV" 48                 android:layout_width="fill_parent" 49                 android:layout_height="wrap_content" 50                 android:text="YV:" /> 51         </LinearLayout> 52     </LinearLayout> 53  54     <TextView 55         android:layout_width="fill_parent" 56         android:layout_height="wrap_content" 57         android:text="Scroll Gesture" /> 58  59     <LinearLayout 60         android:layout_width="fill_parent" 61         android:layout_height="wrap_content" 62         android:orientation="horizontal" > 63  64         <LinearLayout 65             android:layout_width="0dp" 66             android:layout_height="wrap_content" 67             android:layout_weight="1" 68             android:background="#ccc" 69             android:orientation="vertical" > 70  71             <TextView 72                 android:id="@+id/scrollX1" 73                 android:layout_width="fill_parent" 74                 android:layout_height="wrap_content" 75                 android:text="e1.X:" /> 76  77             <TextView 78                 android:id="@+id/scrollY1" 79                 android:layout_width="fill_parent" 80                 android:layout_height="wrap_content" 81                 android:text="e1.Y:" /> 82  83             <TextView 84                 android:id="@+id/distanceX" 85                 android:layout_width="fill_parent" 86                 android:layout_height="wrap_content" 87                 android:text="distanceX:" /> 88         </LinearLayout> 89  90         <LinearLayout 91             android:layout_width="0dp" 92             android:layout_height="wrap_content" 93             android:layout_weight="1" 94             android:background="#ddd" 95             android:orientation="vertical" > 96  97             <TextView 98                 android:id="@+id/scrollX2" 99                 android:layout_width="fill_parent"100                 android:layout_height="wrap_content"101                 android:text="e2.X:" />102 103             <TextView104                 android:id="@+id/scrollY2"105                 android:layout_width="fill_parent"106                 android:layout_height="wrap_content"107                 android:text="e2.Y:" />108 109             <TextView110                 android:id="@+id/distanceY"111                 android:layout_width="fill_parent"112                 android:layout_height="wrap_content"113                 android:text="distanceY:" />114         </LinearLayout>115     </LinearLayout>116 117 </LinearLayout>
activity_gesture_test.xml
  • java程序代码(GestureTest.java)
  1 package org.kit.test.dataio;  2   3 import android.app.Activity;  4 import android.os.Bundle;  5 import android.util.Log;  6 import android.view.GestureDetector;  7 import android.view.GestureDetector.SimpleOnGestureListener;  8 import android.view.MotionEvent;  9 import android.view.View; 10 import android.view.View.OnTouchListener; 11 import android.widget.LinearLayout; 12 import android.widget.TextView; 13 import android.widget.Toast; 14  15 public class GestureTest extends Activity implements OnTouchListener { 16  17     GestureDetector detector; 18  19     TextView posX, posY, velX, velY; 20     TextView scrollX1, scrollY1, scrollX2, scrollY2, _distanceX, _distanceY; 21  22     @Override 23     protected void onCreate(Bundle savedInstanceState) { 24         // TODO Auto-generated method stub 25         super.onCreate(savedInstanceState); 26         setContentView(R.layout.activity_gesture_test); 27  28         detector = new GestureDetector(this, new MySimpleGestureDetector()); 29  30         LinearLayout ll = (LinearLayout) findViewById(R.id.container); 31         ll.setOnTouchListener(this); 32         ll.setClickable(true); 33         ll.setLongClickable(true); 34  35         posX = (TextView) findViewById(R.id.showX); 36         posY = (TextView) findViewById(R.id.showY); 37  38         velX = (TextView) findViewById(R.id.showXV); 39         velY = (TextView) findViewById(R.id.showYV); 40  41         scrollX1 = (TextView) findViewById(R.id.scrollX1); 42         scrollY1 = (TextView) findViewById(R.id.scrollY1); 43         scrollX2 = (TextView) findViewById(R.id.scrollX2); 44         scrollY2 = (TextView) findViewById(R.id.scrollY2); 45         _distanceX = (TextView) findViewById(R.id.distanceX); 46         _distanceY = (TextView) findViewById(R.id.distanceY); 47  48     } 49  50     @Override 51     public boolean onTouch(View v, MotionEvent event) { 52         posX.setText("X:" + event.getX()); 53         posY.setText("Y:" + event.getY()); 54         // 55         return detector.onTouchEvent(event); 56     } 57  58     // 内部类inner class 59     private class MySimpleGestureDetector extends SimpleOnGestureListener { 60  61         @Override 62         public boolean onDoubleTap(MotionEvent e) { 63             // TODO Auto-generated method stub 64  65             Toast.makeText(GestureTest.this, "double tap!", Toast.LENGTH_SHORT).show(); 66             return super.onDoubleTap(e); 67         } 68  69         @Override 70         public boolean onDown(MotionEvent event) { 71             // TODO Auto-generated method stub 72  73             posX.setText("X:" + event.getX()); 74             posY.setText("Y:" + event.getY()); 75             return false; 76         } 77  78         @Override 79         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 80             // TODO Auto-generated method stub 81             velX.setText("XV:" + velocityX); 82             velY.setText("YV:" + velocityY); 83  84             Toast.makeText(    getApplicationContext(), 85                             "Fling!\ne1.X=" + e1.getX() + "  e1.Y=" + e1.getY() + "\ne2.X=" + e2.getX() + "  e2.Y=" 86                                     + e2.getY(), 87                             Toast.LENGTH_LONG).show(); 88  89             return false; 90         } 91  92         @Override 93         public void onLongPress(MotionEvent arg0) { 94             // TODO Auto-generated method stub 95  96             Toast.makeText(getApplicationContext(), "Long Press", Toast.LENGTH_SHORT).show(); 97         } 98  99         @Override100         public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {101             // TODO Auto-generated method stub102 103             scrollX1.setText("e1.X:" + e1.getX());104             scrollY1.setText("e1.Y:" + e1.getY());105             scrollX2.setText("e2.X:" + e2.getX());106             scrollY2.setText("e2.Y:" + e2.getY());107             _distanceX.setText("distanceX:" + distanceX);108             _distanceY.setText("distanceY:" + distanceY);109 110             return false;111         }112 113         @Override114         public void onShowPress(MotionEvent arg0) {115             // TODO Auto-generated method stub116             Toast.makeText(getApplicationContext(), "Show Press!", Toast.LENGTH_LONG).show();117 118         }119 120         @Override121         public boolean onSingleTapUp(MotionEvent e) {122             // TODO Auto-generated method stub123 124             Toast.makeText(getApplicationContext(), "Single Tap", Toast.LENGTH_LONG).show();125             return false;126         }127 128         @Override129         public boolean onSingleTapConfirmed(MotionEvent e) {130             // TODO Auto-generated method stub131 132             Toast.makeText(getApplicationContext(), "Single Tap confirmed", Toast.LENGTH_LONG).show();133 134             return super.onSingleTapConfirmed(e);135         }136 137         @Override138         public boolean onDoubleTapEvent(MotionEvent e) {139             // TODO Auto-generated method stub140             switch (e.getAction()) {141                 case MotionEvent.ACTION_DOWN:142                     Toast.makeText(getApplicationContext(), "double click down", Toast.LENGTH_SHORT).show();143                     break;144                 case MotionEvent.ACTION_UP:145                     Toast.makeText(getApplicationContext(), "double click up", Toast.LENGTH_SHORT).show();146                     break;147 148                 default:149                     break;150             }151             return super.onDoubleTapEvent(e);152         }153     }154 155 }
GestureTest.java