2012-06-07 5 views
7

지난 몇 시간 동안 내 머리를 아프게하고 Google에서 지루해 해 봤습니다. 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를 반환; 내가 생각할 수있는 ... 어떤 도움을 주실까요! :)

고마워요! 상단에 서피스 뷰 SurfaceView와 http://developer.android.com/reference/android/view/SurfaceView.html

, 당신의 버튼은 여전히 ​​작동해야하고 놀아나는 어떤없이 버튼을 극복 할 수 있어야한다 :

답변

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 버튼을 수행합니다. 이 해결책은 정면 뷰의 루트 레이아웃 (LinearLayout, FrameLayout 또는 기타)에 "android:clickable="true"을 추가하는 것입니다.

0

어쩌면 당신은 당신이 모든 놀아나을 처리 느릅 나무에 SurfaceView를 사용하여 오버레이를 설정할 수 있습니다 문제.

+0

답장을 보내 주셔서 감사합니다.하지만 SurfaceView를 사용하지 않는 것이 좋습니다. 주로이 문제는 올바른 방법으로 올바른 "return true; return false"를 설정해야하기 때문에 의도하지 않았습니다. –