查看与手势监听器和onLongClickListener

时间:2011-03-09 22:15:38

标签: android onlongclicklistener

我正在尝试实现一个同时具有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);

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

我认为你遇到的问题是如果按钮消耗了触摸事件,那么第二个视图就不会收到它。

即使它确实如此,我想也只会在用户从开始到结束时执行任务时调用。

我能想到的唯一一件事(尽管它非常可怕/骇客)是尝试插入虚假的触摸事件。这可能允许用户执行投掷,但这也不是特别稳定。

更好的处理方法是让视图组使用触摸事件,将触摸事件传递给手势检测器以检测长按,然后在视图组触摸侦听器中设置标记以指示预期的投掷,然后手动检测prev y和current y何时超过阈值。这将使您对速度有所了解,但可能没有像onFling回调方法中提供的速度那样有意义。

答案 1 :(得分:0)

我最终要解决此问题的方法是在视图上放置一个gestureDectector并覆盖onDown方法。这允许我模拟点击事件。我无法同时获得长时间点击和滑动事件,但出于我的目的,点击事件会在滑动期间触发,这似乎运行得很好。感谢GauntFace的灵感。

答案 2 :(得分:0)

GestureListener还有一个onLongPress事件。