我想實現一個既有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);
任何幫助將不勝感激。
好主意,我在實現這個過程中遇到了很多麻煩。我試圖在手勢監聽器中重新創建一個longClickEvent。通過檢查座標以確保它們與按鈕相匹配,然後模擬長按,我可以捕捉到拋擲事件。 – 2011-03-09 23:12:52
不幸的是,因爲你希望它發生在一次觸摸事件中,所以不會有一個簡單的方法來做到這一點。我所能說的只是從當前的代碼中,而不是將GestureDetector傳遞到setOnTouchListener中,您可以重寫onTouchEvent方法,然後返回mGestureDetector.onTouchEvent(motionEvent);很明顯,在長時間點擊之後,你可以自己消費這些觸覺事件,並按照他們的想法做出自己的想法(即檢測自定義的投擲效果)。 – 2011-03-09 23:16:03