Table of contents


Android Gesture是用來偵測、處理手勢的相關動作,像是手指頭在螢幕畫出圖案,大部份的應用是拿來偵測上下或左右滑過螢幕(swipe), 如果不需要處理特別的手勢,那通常用GestureDetector相關的類別即可。

幾個主要的類別是:

  1. android.view.GestureDetector 偵測手勢
  2. android.view.GestureDetector.OnGestureListener 處理Gesture事件
  3. android.view.GestureDetector.OnDoubleTapListener 處理double-tap(雙擊)事件
  4. android.view.GestureDetector.SimpleOnGestureListener 一個基本的Gesture Listener實作,直接extneds這個類別可以不用實作一堆OnGestureListener,OnDoubleTapListener用不著的methods
  5. android.view.View.OnTouchListener 用來把View上所發生的事件傳給GestureDetector

處理多點觸控的相關類別是:

  1. android.view.ScaleGestureDetector
  2. android.view.OnScaleGestureListener
  3. android.view.SimpleOnScaleGestureListener
public class MyActivity extends Activity {
 
    private GestureDetector    detector;
    private WebView myWebView;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        detector = new GestureDetector(new MyOnGestureListener());
        myWebView.setOnTouchListener(new MyOnTouchListener());
    }    
 
 
    class MyOnGestureListener implements OnGestureListener {
 
        @Override
        public boolean onDown(MotionEvent e) {
            return false;
        }
 
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if (e1.getX() - e2.getX() > 200) { //swipe left,如果向左滑動的距離超過200才執行
            } else if (e2.getX() - e1.getX() > 200) { // 如果向向滑動的距離超過200才執行
            }
            return true;
        }
 
        @Override
        public void onLongPress(MotionEvent e) {
        }
 
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return false;
        }
 
        @Override
        public void onShowPress(MotionEvent e) {
 
        }
 
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }
    }
 
 
    class MyOnTouchListener implements OnTouchListener {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return detector.onTouchEvent(event);
        }
    }
}

使用上比較需要注意的是OnTouchListener,這個要設定到你操作的元件上,本例中,Activity上面是整個被WebView(myWebView)佔住了 ,所以所有的手勢操作是發生在WebView上而不是Activity,所以必須把WebView的TouchEvent傳給detector

上面的MyOnGestureListener可以用下面的這個MySimpleOnGestureListener取代,可以不用實作一堆空methods

class MySimpleOnGestureListener extends SimpleOnGestureListener {
 
 
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (e1.getX() - e2.getX() > 200) { //swipe left,如果向左滑動的距離超過200才執行
        } else if (e2.getX() - e1.getX() > 200) { // 如果向向滑動的距離超過200才執行
        }
        return true;
    }
 
}