Android觸摸事件-05手勢識別

普通的手勢識別

  • 對于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);
      }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容