7

在过去的几个小时里,我一直在头疼,用谷歌搜索了谷歌,StackOverflow 或其他地方的例子都没有对我有用,所以就这样......

我有一个自定义视图,即extends LinearLayout and implements GestureDetector.OnGestureListener.

在我的自定义布局中,我有 3 个按钮,每个按钮都有一个点击监听器。我想要的是能够在视图中到处乱扔以执行某些操作,而且还能够单击按钮。

如果我在视图内而不是在其中一个按钮上进行操作,我的 onFling 功能会非常有效。如果我跳过其中一个按钮,它在大多数情况下会执行点击操作,或者在某些情况下不会执行任何操作。

这是我的代码的相关部分:

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
            return false;
        }
        // right to left swipe
        if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            viewFlipper.setInAnimation(slideLeftIn);
            viewFlipper.setOutAnimation(slideLeftOut);
            viewFlipper.showNext();
            return true;

        } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            viewFlipper.setInAnimation(slideRightIn);
            viewFlipper.setOutAnimation(slideRightOut);
            viewFlipper.showPrevious();
            return true;
        }

        return false;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (gestureDetector.onTouchEvent(event)) {
            return gestureDetector.onTouchEvent(event);
        }
        return false;
    }

尝试了返回 true 的任意组合;返回假;我能想到...将不胜感激任何帮助!:)

谢谢!

4

3 回答 3

3

这是最终为我解决的问题......(仅来自我的问题的修改代码)。不确定这是否是最好的解决方案,但它有效:

@Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

@Override
    public boolean onTouchEvent(MotionEvent e) {
        return gestureDetector.onTouchEvent(e);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        return onTouchEvent(e);
    }

这将允许投掷手势,即使在按钮上,也允许简单地单击按钮,但是如果您在该视图后面有另一个带有按钮的视图,有时点击会向后传递并在视图后面的按钮上执行 onClick。解决方案是添加"android:clickable="true"到前视图的根布局(LinearLayout、FrameLayout 或其他)。

于 2012-06-11T07:53:19.497 回答
1

这是一个可能与您描述的情况有关的答案https://stackoverflow.com/a/9182176/780700

于 2012-06-10T09:52:17.420 回答
0

也许你可以设置一个覆盖SurfaceView,你可以处理所有的事情:http: //developer.android.com/reference/android/view/SurfaceView.html

使用顶部的surfaceView,您的按钮应该仍然可以工作,并且您的flings 应该能够毫无问题地越过按钮。

于 2012-06-07T15:52:56.010 回答