2012-06-07 33 views
7

我一直在打破我的头过去几个小时,谷歌搜索了地狱,并没有在StackOverflow或其他地方的例子为我工作,所以在这里它去...自定义视图与按钮实现OnGestureListener

我有一个自定义视图,即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; 
    } 

试图回归真实的任意组合;返回false;我能想到...会感谢任何帮助! :)

谢谢!

回答

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或其他)。

0

也许你可以设置至极使用SurfaceView你处理所有的甩叠加: http://developer.android.com/reference/android/view/SurfaceView.html

,顶部的一个surfaceView,您的按钮应该还是工作,你甩应该能够克服这些按钮没有任何问题。

+0

感谢您的回复,但我更喜欢不使用SurfaceView,因为它不适用于此,主要是因为我的问题应该是在正确的方法中设置正确的“返回true; return false”。 –