2011-03-09 35 views
1

我想實現一個既有longClickListener又有手勢檢測器的視圖。基本上,我需要一個按鈕來顯示一個視圖,當用戶長時間點擊第一個視圖,然後我想要檢測到一個投擲動作。我想這樣做的目的是使用戶不必一直擡起手指,同時擊中長擊和投擲動作。用手勢監聽器和onLongClickListener查看

這裏是我的longClickListener代碼:

flipCard.setOnLongClickListener(new View.OnLongClickListener() { 
      public boolean onLongClick(View view) { 
        answerRight.setVisibility(View.VISIBLE); 
        answerRight.startAnimation(AnimationUtils.loadAnimation(view.getContext(), R.anim.grow_from_middle)); 
        answerWrong.setVisibility(View.VISIBLE); 
        answerWrong.startAnimation(AnimationUtils.loadAnimation(view.getContext(), R.anim.grow_from_middle)); 
        return false; 
      } 
     }); 

這裏是我的手勢dector代碼:

gestureDetectorScore = new GestureDetector(new ScoreGestureDetector()); 
    gestureListenerScore = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetectorScore.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     } 
    }; 
private class ScoreGestureDetector extends SimpleOnGestureListener { 

    private static final int SWIPE_MIN_DISTANCE = 5; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 2; 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     try { 
       //if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH) 
       //return false; 
       // right to left swipe 
       //if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE){ 
       Toast.makeText(AndroidOrientationSensor.this, "Up Swipe", Toast.LENGTH_SHORT).show(); 
       } 
       //else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE){ 
        Toast.makeText(AndroidOrientationSensor.this, "Down Swipe", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return false; 
    } 

    @Override 
    public boolean onDown(MotionEvent e1){ 
     Toast.makeText(AndroidOrientationSensor.this, "Up Swipe", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 

} 

最後,我手勢dectector設置到了「活頁片」視圖像這樣:

flipCard.setOnTouchListener(gestureListenerScore); 

任何幫助將不勝感激。

回答

0

我最終解決這個問題的方法是在視圖上放置一個gestureDectector並重寫onDown方法。這使我可以模擬點擊事件。我無法同時獲得長時間點擊和滑動事件,但出於我的目的,點擊事件在刷卡過程中觸發,似乎工作得很好。感謝GauntFace的靈感。

0

我認爲你將遇到的問題是,如果觸摸事件被按鈕消耗,那麼第二個視圖將不會收到它。

即使這樣做了,我想象中的這個投擲只會在用戶從頭到尾執行一次投擲時被調用。

我能想到的唯一的事情就是嘗試插入假冒的觸摸事件(儘管它非常可怕/哈克)。這可能允許用戶執行投擲,但這也不是特別穩定。

更好的處理方法是讓視圖組消耗觸摸事件,將觸摸事件傳遞給手勢檢測器以檢測長時間點擊,然後在視圖內設置一個標記組觸摸監聽器來指示一個投影是預期,然後手動檢測prev y和當前y超出閾值的時間。這會給你一些速度的概念,但可能沒有像在onFling回調方法中提供的速度那麼有意義。

+0

好主意,我在實現這個過程中遇到了很多麻煩。我試圖在手勢監聽器中重新創建一個longClickEvent。通過檢查座標以確保它們與按鈕相匹配,然後模擬長按,我可以捕捉到拋擲事件。 – 2011-03-09 23:12:52

+0

不幸的是,因爲你希望它發生在一次觸摸事件中,所以不會有一個簡單的方法來做到這一點。我所能說的只是從當前的代碼中,而不是將GestureDetector傳遞到setOnTouchListener中,您可以重寫onTouchEvent方法,然後返回mGestureDetector.onTouchEvent(motionEvent);很明顯,在長時間點擊之後,你可以自己消費這些觸覺事件,並按照他們的想法做出自己的想法(即檢測自定義的投擲效果)。 – 2011-03-09 23:16:03

0

GestureListener還有一個onLongPress事件。

+0

這是事實,但事件被消耗,並且沒有捕捉到投擲事件。其實很有趣,因爲爲了趕上onLongPress事件,你應該首先捕獲onDown事件。 api聲明「所有其他事件都應該在此之前」。此外,onLongPress事件總是消耗事件,這將消除投擲事件。請參閱http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html#onLongPress(android.view.MotionEvent) – 2011-03-16 04:54:26