我正在尝试实现一个同时具有longClickListener和手势检测器的视图。基本上,当用户长时间点击第一个视图时,我需要一个按钮来显示视图,然后我想要检测一个投影动作。我想这样做,以便用户根本不必抬起手指,同时点击长按和投掷动作。
这是我的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;
}
});
以下是我的手势代码的代码:
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;
}
}
最后,我将手势检测器设置为“flipCard”视图,如下所示:
flipCard.setOnTouchListener(gestureListenerScore);
非常感谢任何帮助。
答案 0 :(得分:0)
我认为你遇到的问题是如果按钮消耗了触摸事件,那么第二个视图就不会收到它。
即使它确实如此,我想也只会在用户从开始到结束时执行任务时调用。
我能想到的唯一一件事(尽管它非常可怕/骇客)是尝试插入虚假的触摸事件。这可能允许用户执行投掷,但这也不是特别稳定。
更好的处理方法是让视图组使用触摸事件,将触摸事件传递给手势检测器以检测长按,然后在视图组触摸侦听器中设置标记以指示预期的投掷,然后手动检测prev y和current y何时超过阈值。这将使您对速度有所了解,但可能没有像onFling回调方法中提供的速度那样有意义。
答案 1 :(得分:0)
我最终要解决此问题的方法是在视图上放置一个gestureDectector并覆盖onDown方法。这允许我模拟点击事件。我无法同时获得长时间点击和滑动事件,但出于我的目的,点击事件会在滑动期间触发,这似乎运行得很好。感谢GauntFace的灵感。
答案 2 :(得分:0)
GestureListener还有一个onLongPress事件。