2012-06-07 16 views
7

Tôi đã phá vỡ đầu của tôi trong vài giờ qua, googled địa ngục ra khỏi google và không ai trong số các ví dụ trên StackOverflow hoặc những nơi khác làm việc cho tôi như vậy ở đây ...Chế độ xem tùy chỉnh với các nút thực hiện OnGestureListener

Tôi có chế độ xem tùy chỉnh, extends LinearLayout and implements GestureDetector.OnGestureListener.

Trong bố cục tùy chỉnh của tôi, tôi có 3 Nút, mỗi nút có trình nghe nhấp chuột. Những gì tôi muốn là để có thể Fling ở khắp mọi nơi trong xem để thực hiện một cái gì đó mà còn để có thể bấm vào các nút.

Chức năng onFling của tôi hoạt động tuyệt vời nếu tôi trượt bên trong chế độ xem nhưng không phải trên một trong các nút. Nếu tôi lướt qua một trong các nút, nó thực hiện một cú nhấp chuột trong hầu hết các trường hợp hoặc không có gì trong một số.

Dưới đây là phần có liên quan của mã của tôi:

@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; 
    } 

thử bất kỳ sự kết hợp của return true; return false; Tôi có thể nghĩ đến ... Sẽ đánh giá cao sự giúp đỡ nào! :)

Cảm ơn!

Trả lời

3

Dưới đây là những gì giải quyết nó cho tôi cuối cùng ... (chỉ có mã đổi từ câu hỏi của tôi). Không chắc chắn nếu đó là giải pháp tốt nhất nhưng nó hoạt động:

@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); 
    } 

này sẽ cho phép các cử chỉ fling, thậm chí qua các nút và cũng cho phép nhấp chuột đơn giản vào các nút NHƯNG nếu bạn có một cái nhìn với các nút đằng sau này xem, đôi khi các nhấp chuột sẽ chuyển về phía sau và thực hiện onClick trên các nút phía sau chế độ xem. Giải pháp cho việc này là thêm "android:clickable="true" vào bố cục gốc của chế độ xem trước (LinearLayout, FrameLayout hoặc bất kỳ thứ gì).

0

Có lẽ bạn có thể thiết lập một lớp phủ sử dụng SurfaceView trong Mà bạn xử lý tất cả các nhận được nội dung: http://developer.android.com/reference/android/view/SurfaceView.html

Với surfaceView on Top, các nút của bạn vẫn phải làm việc và nhận được nội dung của bạn sẽ có thể vượt qua các nút mà không cần bất kỳ các vấn đề.

+0

cảm ơn bạn đã trả lời nhưng tôi không muốn sử dụng SurfaceView vì nó không dành cho điều này và chủ yếu là vì vấn đề của tôi phải là vấn đề đặt đúng "trả về true; return false" theo đúng phương pháp. –

1

Dưới đây là một câu trả lời có thể có liên quan đến tình huống mà bạn đang mô tả https://stackoverflow.com/a/9182176/780700

+0

Cảm ơn .. đã giúp nhưng không phải là giải pháp phù hợp với tôi. –

Các vấn đề liên quan