Android觸摸事件-05手勢(shì)識(shí)別

普通的手勢(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),并松開(kāi)的動(dòng)作。
    • 長(zhǎng)按(onLongPress): 手指按下持續(xù)一段時(shí)間,并且沒(méi)有松開(kāi)。
    • 滾動(dòng)(onScroll): 手指在觸摸屏上滑動(dòng)。
    • 按?。╫nShowPress): 手指按在觸摸屏上,它的時(shí)間范圍在按下起效,在長(zhǎng)按之前,一般用來(lái)給按下設(shè)置視覺(jué)效果
    • 抬起(onSingleTapUp):手指離開(kāi)觸摸屏的那一剎那,是針對(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);
      }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容