带按钮的自定义视图实现了OnGestureListener

时间:2012-06-07 15:44:29

标签: android android-view android-gesture

在过去的几个小时里我一直在迷失方向,谷歌搜索出谷歌的地狱,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的组合;返回false;我能想到...会感激任何帮助! :)

谢谢!

3 个答案:

答案 0 :(得分: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或其他)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

也许你可以使用SurfaceView设置一个叠加层来处理所有的flings: http://developer.android.com/reference/android/view/SurfaceView.html

将SurfaceView放在顶部,你的按钮仍然可以正常工作,你的啪啪声应该可以毫无问题地克服按钮。