歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

理解Android的手勢識別

對於觸摸屏,其原生的消息無非按下、抬起、移動這幾種,我們只需要簡單重載onTouch或者設置觸摸偵聽器setOnTouchListener即可進行處理。不過,為了提高我們的APP的用戶體驗,有時候我們需要識別用戶的手勢,Android給我們提供的手勢識別工具GestureDetector就可以幫上大忙了。

基礎

GestureDetector的工作原理是,當我們接收到用戶觸摸消息時,將這個消息交給GestureDetector去加工,我們通過設置偵聽器獲得GestureDetector處理後的手勢。

GestureDetector提供了兩個偵聽器接口,OnGestureListener處理單擊類消息,OnDoubleTapListener處理雙擊類消息。

OnGestureListener的接口有這幾個:

  1. // 單擊,觸摸屏按下時立刻觸發   
  2. abstract boolean onDown(MotionEvent e);  
  3. // 抬起,手指離開觸摸屏時觸發(長按、滾動、滑動時,不會觸發這個手勢)   
  4. abstract boolean onSingleTapUp(MotionEvent e);  
  5. // 短按,觸摸屏按下後片刻後抬起,會觸發這個手勢,如果迅速抬起則不會   
  6. abstract void onShowPress(MotionEvent e);  
  7. // 長按,觸摸屏按下後既不抬起也不移動,過一段時間後觸發   
  8. abstract void onLongPress(MotionEvent e);  
  9. // 滾動,觸摸屏按下後移動   
  10. abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);  
  11. // 滑動,觸摸屏按下後快速移動並抬起,會先觸發滾動手勢,跟著觸發一個滑動手勢   
  12. abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);  

OnDoubleTapListener的接口有這幾個:

  1. // 雙擊,手指在觸摸屏上迅速點擊第二下時觸發   
  2. abstract boolean onDoubleTap(MotionEvent e);  
  3. // 雙擊的按下跟抬起各觸發一次   
  4. abstract boolean onDoubleTapEvent(MotionEvent e);  
  5. // 單擊確認,即很快的按下並抬起,但並不連續點擊第二下   
  6. abstract boolean onSingleTapConfirmed(MotionEvent e);  

有時候我們並不需要處理上面所有手勢,方便起見,Android提供了另外一個類SimpleOnGestureListener實現了如上接口,我們只需要繼承SimpleOnGestureListener然後重載感興趣的手勢即可。

應用

STEP 1: 創建手勢偵聽對象

  1. package noodies.blog.csdn.net;  
  2.   
  3. import android.content.Context;  
  4. import android.view.MotionEvent;  
  5. import android.view.GestureDetector.SimpleOnGestureListener;  
  6. import android.widget.Toast;  
  7.   
  8. public class MyGestureListener extends SimpleOnGestureListener {  
  9.   
  10.     private Context mContext;  
  11.       
  12.     MyGestureListener(Context context) {  
  13.         mContext = context;  
  14.     }  
  15.       
  16.     @Override  
  17.     public boolean onDown(MotionEvent e) {  
  18.         Toast.makeText(mContext, "DOWN " + e.getAction(), Toast.LENGTH_SHORT).show();  
  19.         return false;  
  20.     }  
  21.   
  22.     @Override  
  23.     public void onShowPress(MotionEvent e) {  
  24.         Toast.makeText(mContext, "SHOW " + e.getAction(), Toast.LENGTH_SHORT).show();             
  25.     }  
  26.   
  27.     @Override  
  28.     public boolean onSingleTapUp(MotionEvent e) {  
  29.         Toast.makeText(mContext, "SINGLE UP " + e.getAction(), Toast.LENGTH_SHORT).show();  
  30.         return false;  
  31.     }  
  32.   
  33.     @Override  
  34.     public boolean onScroll(MotionEvent e1, MotionEvent e2,  
  35.             float distanceX, float distanceY) {  
  36.         Toast.makeText(mContext, "SCROLL " + e2.getAction(), Toast.LENGTH_SHORT).show();  
  37.         return false;  
  38.     }  
  39.   
  40.     @Override  
  41.     public void onLongPress(MotionEvent e) {  
  42.         Toast.makeText(mContext, "LONG " + e.getAction(), Toast.LENGTH_SHORT).show();  
  43.     }  
  44.   
  45.     @Override  
  46.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  47.             float velocityY) {  
  48.         Toast.makeText(mContext, "FLING " + e2.getAction(), Toast.LENGTH_SHORT).show();  
  49.         return false;  
  50.     }  
  51.   
  52.     @Override  
  53.     public boolean onDoubleTap(MotionEvent e) {  
  54.         Toast.makeText(mContext, "DOUBLE " + e.getAction(), Toast.LENGTH_SHORT).show();  
  55.         return false;  
  56.     }  
  57.   
  58.     @Override  
  59.     public boolean onDoubleTapEvent(MotionEvent e) {  
  60.         Toast.makeText(mContext, "DOUBLE EVENT " + e.getAction(), Toast.LENGTH_SHORT).show();  
  61.         return false;  
  62.     }  
  63.   
  64.     @Override  
  65.     public boolean onSingleTapConfirmed(MotionEvent e) {  
  66.         Toast.makeText(mContext, "SINGLE CONF " + e.getAction(), Toast.LENGTH_SHORT).show();  
  67.         return false;  
  68.     }  
  69. }  
Copyright © Linux教程網 All Rights Reserved