2016-03-04 74 views
3

我有一個ImageView填補我的整個Activity。我需要能夠檢測4個觸摸事件:檢測刷卡,單擊,按住一個查看Android

  • 保持(大於400毫秒)
  • 點擊
  • 向左滑動
  • 向右滑動,即可

在我能夠瞬間使用以下代碼檢測前兩個:

imageView.setOnTouchListener(new View.OnTouchListener() { 

    private Timer timerr = new Timer(); 
    private long LONG_PRESS_TIMEOUT = 400; // TODO: your timeout here 
    private boolean wasLong = false; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     Log.d(getClass().getName(), "touch event: " + event.toString()); 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     // HOLD DETECTED 
     timerr.schedule(new TimerTask() { 
      @Override 
      public void run() { 
      SlideShow.this.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 

       }, LONG_PRESS_TIMEOUT); 
      return true; 
      } 

      if (event.getAction() == MotionEvent.ACTION_UP) { 
      if (!isPaused && !wasLong) { 
       // CLICK DETECTED 
       timerr.cancel(); 
       timerr = new Timer(); 
       if (!wasLong) { 

       return false; 
       } 
      }); 

現在我試圖用這個問題的代碼實現向右滑動並滑動左邊的動作。 Android Swipe on List與此問題是,這可以在列表視圖上工作,在那裏你可以實現整個列表視圖的onTouchListener,以及列表項的單獨的onItemClickListener。儘管只有一個Listener可用,但我不知道如何適應這種情況。

回答

2

手勢檢測器是要走的路。

或者,

image.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      switch (event.getAction()) { 

       case MotionEvent.ACTION_DOWN: 
        x1 = event.getX(); 
        y1 = event.getY(); 
        t1 = System.currentTimeMillis(); 
        return true; 
       case MotionEvent.ACTION_UP: 
        x2 = event.getX(); 
        y2 = event.getY(); 
        t2 = System.currentTimeMillis(); 

        if (x1 == x2 && y1 == y2 && (t2 - t1) < CLICK_DURATION) { 
         Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show(); 
        } else if ((t2 - t1) >= CLICK_DURATION) { 
         Toast.makeText(getActivity(), "Long click", Toast.LENGTH_SHORT).show(); 
        } else if (x1 > x2) { 
         Toast.makeText(getActivity(), "Left swipe", Toast.LENGTH_SHORT).show(); 
        } else if (x2 > x1) { 
         Toast.makeText(getActivity(), "Right swipe", Toast.LENGTH_SHORT).show(); 
        } 


        return true; 
      } 

      return false; 
     }