普通的手勢(shì)識(shí)別
-
對(duì)于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); } } }
-
如果繼承一個(gè)類产还,可重寫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; } });
如果要識(shí)別一個(gè)手勢(shì)是長(zhǎng)按脐区,雙擊,滑動(dòng)等她按,應(yīng)當(dāng)使用 GestureDetector 進(jìn)行手勢(shì)識(shí)別,GestureDetector類對(duì)外提供了兩個(gè)接口:OnGestureListener牛隅,OnDoubleTapListener炕柔,還有一個(gè)內(nèi)部類SimpleOnGestureListener;SimpleOnGestureListener類是GestureDetector提供給我們的一個(gè)更方便的響應(yīng)不同手勢(shì)的類媒佣,它實(shí)現(xiàn)了上述兩個(gè)接口匕累,該類是static class,也就是說(shuō)它實(shí)際上是一個(gè)外部類默伍,我們可以在外部繼承這個(gè)類欢嘿,重寫里面的手勢(shì)處理方法。因此實(shí)現(xiàn)手勢(shì)識(shí)別有兩種方法也糊,一種實(shí)現(xiàn)OnGestureListener接口炼蹦,另一種是使用SimpleOnGestureListener類
-
OnGestureListener有下面的幾個(gè)動(dòng)作
- 按下(onDown): 剛剛手指接觸到觸摸屏的那一剎那,MotionEvent.ACTION_DOWN事件
- 拋擲(onFling): 手指在觸摸屏上迅速移動(dòng)狸剃,并松開的動(dòng)作掐隐。
- 長(zhǎng)按(onLongPress): 手指按下持續(xù)一段時(shí)間,并且沒(méi)有松開钞馁。
- 滾動(dòng)(onScroll): 手指在觸摸屏上滑動(dòng)虑省。
- 按住(onShowPress): 手指按在觸摸屏上指攒,它的時(shí)間范圍在按下起效慷妙,在長(zhǎng)按之前,一般用來(lái)給按下設(shè)置視覺(jué)效果
- 抬起(onSingleTapUp):手指離開觸摸屏的那一剎那,是針對(duì)onDown事件的允悦,onLongPress結(jié)束是不會(huì)執(zhí)行這個(gè)方法的膝擂。
- 單擊(onSingleTapConfirmed):一次tap結(jié)束,并且沒(méi)有緊跟雙擊事件,ACTION_UP時(shí)觸發(fā)
- 雙擊(onDoubleTap):發(fā)生了雙擊事件
- 雙擊過(guò)程中的事件(onDoubleTapEvent):雙擊事件中隙弛,發(fā)生的事件架馋,包括ACTION_DOWN, ACTION_MOVE, ACTION_UP
-
相關(guān)函數(shù)
abstract boolean onDown(MotionEvent e) //只要是ACTION_DOWN一定會(huì)觸發(fā),并且ACTION_DOWN后立即觸發(fā) abstract void onShowPress(MotionEvent e) //按下了全闷,但還沒(méi)有移動(dòng),也沒(méi)有ACTION_UP叉寂,一般用來(lái)提供按下的視覺(jué)反饋 abstract boolean onSingleTapUp(MotionEvent e) //一個(gè)tap的ACTION_UP事件,onLongPress結(jié)束是不會(huì)執(zhí)行這個(gè)方法的 abstract void onLongPress(MotionEvent e) //觸發(fā)了長(zhǎng)按事件 abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) //Touch了滑動(dòng)一點(diǎn)距離后总珠,up時(shí)觸發(fā) abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) //按下并發(fā)生了滑動(dòng)發(fā)生 boolean onSingleTapConfirmed(MotionEvent e) //一次tap的ACTION_UP屏鳍,并且確定沒(méi)有緊跟雙擊事件,有點(diǎn)類似onClickListener boolean onDoubleTap(MotionEvent e) //發(fā)生了雙擊事件局服,并且e為雙擊事件的第一個(gè)tap的ACTION_DOWN事件 boolean onDoubleTapEvent(MotionEvent e) //雙擊事件中钓瞭,發(fā)生的事件,包括ACTION_DOWN, ACTION_MOVE, ACTION_UP
-
使用GestureDetector注意點(diǎn)
- 如果對(duì)view使用淫奔,則View必須設(shè)置longClickable為true山涡,否則手勢(shì)識(shí)別無(wú)法正確工作
- 如果在onTouchEvent中合用手勢(shì)識(shí)別,必須 調(diào)用super對(duì)應(yīng)的函數(shù)
@Override public boolean onTouchEvent(MotionEvent event){ this.mDetector.onTouchEvent(event); // Be sure to call the superclass implementation return super.onTouchEvent(event); }