普通的手勢識別
-
對于activity或view觸措事件,使用getActionMasked() 獲得純粹的事件類型,而不包含Pointer信
public class MainActivity extends Activity { // This example shows an Activity, but you would use the same approach if // you were subclassing a View. @Override public boolean onTouchEvent(MotionEvent event){ int action = MotionEventCompat.getActionMasked(event); switch(action) { case (MotionEvent.ACTION_DOWN) : Log.d(DEBUG_TAG,"Action was DOWN"); return true; case (MotionEvent.ACTION_MOVE) : Log.d(DEBUG_TAG,"Action was MOVE"); return true; case (MotionEvent.ACTION_UP) : Log.d(DEBUG_TAG,"Action was UP"); return true; case (MotionEvent.ACTION_CANCEL) : Log.d(DEBUG_TAG,"Action was CANCEL"); return true; case (MotionEvent.ACTION_OUTSIDE) : Log.d(DEBUG_TAG,"Movement occurred outside bounds " + "of current screen element"); return true; default : return super.onTouchEvent(event); } } }
-
如果繼承一個類,可重寫onTouchEvent方法,而如果不想繼承生成新的類,可以使用setOnTouchListener
View myView = findViewById(R.id.my_view); myView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // ... Respond to touch events return true; } });
如果要識別一個手勢是長按,雙擊,滑動等,應當使用 GestureDetector 進行手勢識別,GestureDetector類對外提供了兩個接口:OnGestureListener,OnDoubleTapListener,還有一個內部類SimpleOnGestureListener;SimpleOnGestureListener類是GestureDetector提供給我們的一個更方便的響應不同手勢的類,它實現了上述兩個接口,該類是static class,也就是說它實際上是一個外部類,我們可以在外部繼承這個類,重寫里面的手勢處理方法。因此實現手勢識別有兩種方法,一種實現OnGestureListener接口,另一種是使用SimpleOnGestureListener類
-
OnGestureListener有下面的幾個動作
- 按下(onDown): 剛剛手指接觸到觸摸屏的那一剎那,MotionEvent.ACTION_DOWN事件
- 拋擲(onFling): 手指在觸摸屏上迅速移動,并松開的動作。
- 長按(onLongPress): 手指按下持續一段時間,并且沒有松開。
- 滾動(onScroll): 手指在觸摸屏上滑動。
- 按?。╫nShowPress): 手指按在觸摸屏上,它的時間范圍在按下起效,在長按之前,一般用來給按下設置視覺效果
- 抬起(onSingleTapUp):手指離開觸摸屏的那一剎那,是針對onDown事件的,onLongPress結束是不會執行這個方法的。
- 單擊(onSingleTapConfirmed):一次tap結束,并且沒有緊跟雙擊事件,ACTION_UP時觸發
- 雙擊(onDoubleTap):發生了雙擊事件
- 雙擊過程中的事件(onDoubleTapEvent):雙擊事件中,發生的事件,包括ACTION_DOWN, ACTION_MOVE, ACTION_UP
-
相關函數
abstract boolean onDown(MotionEvent e) //只要是ACTION_DOWN一定會觸發,并且ACTION_DOWN后立即觸發 abstract void onShowPress(MotionEvent e) //按下了,但還沒有移動,也沒有ACTION_UP,一般用來提供按下的視覺反饋 abstract boolean onSingleTapUp(MotionEvent e) //一個tap的ACTION_UP事件,onLongPress結束是不會執行這個方法的 abstract void onLongPress(MotionEvent e) //觸發了長按事件 abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) //Touch了滑動一點距離后,up時觸發 abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) //按下并發生了滑動發生 boolean onSingleTapConfirmed(MotionEvent e) //一次tap的ACTION_UP,并且確定沒有緊跟雙擊事件,有點類似onClickListener boolean onDoubleTap(MotionEvent e) //發生了雙擊事件,并且e為雙擊事件的第一個tap的ACTION_DOWN事件 boolean onDoubleTapEvent(MotionEvent e) //雙擊事件中,發生的事件,包括ACTION_DOWN, ACTION_MOVE, ACTION_UP
-
使用GestureDetector注意點
- 如果對view使用,則View必須設置longClickable為true,否則手勢識別無法正確工作
- 如果在onTouchEvent中合用手勢識別,必須 調用super對應的函數
@Override public boolean onTouchEvent(MotionEvent event){ this.mDetector.onTouchEvent(event); // Be sure to call the superclass implementation return super.onTouchEvent(event); }