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             <TextView
104                 android:id="@+id/scrollY2"
105                 android:layout_width="fill_parent"
106                 android:layout_height="wrap_content"
107                 android:text="e2.Y:" />
108 
109             <TextView
110                 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         @Override
100         public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
101             // TODO Auto-generated method stub
102 
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         @Override
114         public void onShowPress(MotionEvent arg0) {
115             // TODO Auto-generated method stub
116             Toast.makeText(getApplicationContext(), "Show Press!", Toast.LENGTH_LONG).show();
117 
118         }
119 
120         @Override
121         public boolean onSingleTapUp(MotionEvent e) {
122             // TODO Auto-generated method stub
123 
124             Toast.makeText(getApplicationContext(), "Single Tap", Toast.LENGTH_LONG).show();
125             return false;
126         }
127 
128         @Override
129         public boolean onSingleTapConfirmed(MotionEvent e) {
130             // TODO Auto-generated method stub
131 
132             Toast.makeText(getApplicationContext(), "Single Tap confirmed", Toast.LENGTH_LONG).show();
133 
134             return super.onSingleTapConfirmed(e);
135         }
136 
137         @Override
138         public boolean onDoubleTapEvent(MotionEvent e) {
139             // TODO Auto-generated method stub
140             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

转载于:https://www.cnblogs.com/kithome/p/3821341.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值