2012-06-07 27 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」。 –