android中使用触屏触控技术和手势识别技术,有许多细节问题,这里整理一下,供大家参考。
package com.ethan.touch;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
import android.widget.Toast;

/**
* 测试触摸和手势
*
* @author ethan 实现了触控监听和手势监听
*/

public class TouchGestureActivity extends Activity implements OnTouchListener,
    OnGestureListener {

   private static final String tag = "TouchGestureActivity";

   public GestureDetector mGestureDetector;
  TextView textView;

  @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

     // 初始化手势识别对象,有时候很容易忘记,就会报空指针异常
    mGestureDetector = new GestureDetector( this);
    textView = (TextView) this.findViewById(R.id.textView);
    textView.setOnTouchListener( this);
    textView.setLongClickable( true); // 不设置这行,onFling可能监听不到

  }

   /*
    * 触摸事件监听(这里既然用了手势,就需要将触摸事件的event传递给手势的监听)
    */

  @Override
   public boolean onTouch(View v, MotionEvent event) {
     // OnGestureListener will analyzes the given motion event
     return mGestureDetector.onTouchEvent(event);
  }

   /*
    * 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
    */

  @Override
   public boolean onDown(MotionEvent e) {
    Log.i(tag, "onDown!");
     return false;
  }

   /*
    * 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
    */

  @Override
   public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
       float velocityY) {

    Log.i(tag, "onFling!");
     // 参数解释:
     // e1:第1个ACTION_DOWN MotionEvent
     // e2:最后一个ACTION_MOVE MotionEvent
     // velocityX:X轴上的移动速度,像素/秒
     // velocityY:Y轴上的移动速度,像素/秒

     // 触发条件 :
     // X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒

     int FLING_MIN_DISTANCE = 100;
     int FLING_MIN_VELOCITY = 200;

     if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
        && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
       // Fling left
      Toast.makeText( this, "Fling Left", Toast.LENGTH_SHORT).show();
    } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
        && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
       // Fling right
      Toast.makeText( this, "Fling Right", Toast.LENGTH_SHORT).show();
    }

     return false;
  }

   /*
    * 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
    */

  @Override
   public void onLongPress(MotionEvent e) {
    Log.i(tag, "onLongPress!");
  }

   /*
    * 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
    */

  @Override
   public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
       float distanceY) {
    Log.i(tag, "onScroll!");
     //参数和onFling里面差不多
     return false;
  }

   /*
    * 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
    * 注意和onDown()的区别,强调的是没有松开或者拖动的状态
    */

  @Override
   public void onShowPress(MotionEvent e) {
    Log.i(tag, "onShowPress!");
  }

   /*
    * 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
    */

  @Override
   public boolean onSingleTapUp(MotionEvent e) {
    Log.i(tag, "onSingleTapUp!");
     return false;
  }

}