2012-06-30 41 views
7

Tôi muốn GestureOverlayView của tôi phát hiện cả cử chỉ ngang cũng như dọc hoàn toàn.Cử chỉ dọc và ngang trong Android

Từ http://android-developers.blogspot.com/2009/10/gestures-on-android-16.html

"định hướng: chỉ ra phương hướng cuộn của các quan điểm bên dưới Trong trường hợp này danh sách cuộn theo chiều dọc, có nghĩa là bất kỳ cử chỉ ngang (như action_delete) ngay lập tức có thể được công nhận là một cử chỉ.. Cử chỉ bắt đầu bằng một nét thẳng đứng phải chứa ít nhất một thành phần nằm ngang để được nhận dạng. Nói cách khác, một đường thẳng đứng đơn giản không thể được nhận dạng như một cử chỉ vì nó sẽ xung đột với cuộn của danh sách. "

Có vẻ giống như catch-22, nếu android: orientation được đặt thành dọc, tôi chỉ có thể vuốt ngang và nếu android: orientation được đặt thành ngang, tôi chỉ có thể vuốt dọc. Làm cách nào tôi có thể nhận được yêu cầu này?

+2

Bạn đã bao giờ tìm ra giải pháp cho điều này chưa? – capcom

+0

Không, vẫn chưa có giải pháp nào cho Android ... – Bashevis

+0

Geez, vậy làm thế nào để tôi làm những gì tôi cần? Tôi thực sự cần phải làm điều này. Hướng dẫn này hiển thị lên và xuống được thực hiện trong Gestures Builder http://www.vogella.com/articles/AndroidGestures/article.html, mặc dù không được sử dụng. Đây là câu hỏi của riêng tôi, nếu bạn muốn có một cái nhìn, http://stackoverflow.com/questions/14246998/detecting-vertical-gestures. Nó không có ý nghĩa rằng không có cách nào để làm điều này, các ứng dụng khác sử dụng loại chức năng tất cả các thời gian. – capcom

Trả lời

5

Tôi đã gặp phải sự cố này tại một cuộc chạy đua. Không có cách nào bạn có thể giải quyết nó bằng GestureOverlayView, vì vậy bạn phải sử dụng các sự kiện chuyển động. Tuy nhiên, GestureOverlayView hoạt động với các cử chỉ "chi tiết" hơn một chút, giống như hình tròn. Những gì tôi đã nhận thấy là GestureOverlayView hoạt động tốt nhất cho các hình đóng. Vì vậy, motionEvent cảm biến nó được. Tôi đã tìm thấy mã số here. Tôi cũng đã sửa đổi câu trả lời của Gav cho các lần vuốt dọc. Chưa thử nghiệm nó, nhưng tích cực rằng nó sẽ làm việc.

Dưới đây là một ví dụ:

public class SelectFilterActivity extends Activity implements OnClickListener 
{ 

private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
private GestureDetector gestureDetector; 
View.OnTouchListener gestureListener; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* ... */ 

    // Gesture detection 
    gestureDetector = new GestureDetector(new MyGestureDetector()); 
    gestureListener = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      return gestureDetector.onTouchEvent(event); 
     } 
    }; 

} 

class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     try { 
      // downward swipe 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) 
       Toast.makeText(SelectFilterActivity.this, "Downward Swipe", Toast.LENGTH_SHORT).show(); 
else if (Math.abs(e2.getY() - e1.getY()) > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) 
       Toast.makeText(SelectFilterActivity.this, "Upward Swipe", Toast.LENGTH_SHORT).show(); 
      // right to left swipe 
      else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show(); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 

} 

Bây giờ thêm nó vào quan điểm mà bạn muốn phát hiện cử chỉ,

// Do this for each view added to the grid 
    imageView.setOnClickListener(SelectFilterActivity.this); 
    imageView.setOnTouchListener(gestureListener); 

Cheers cho Gav cho mã!

+0

Tôi đã thực hiện điều này trong mã của mình, nhưng cảm ơn câu trả lời của bạn. Vấn đề là, tôi muốn tất cả các cử chỉ hoàn toàn thẳng đứng và nằm ngang, cùng với bất kỳ thứ gì tôi thiết kế từ gestureoverlayview. Chắc chắn, bạn có thể hack xung quanh với các cử chỉ để phát hiện một vòng tròn và như vậy, nhưng đó là một nỗi đau thực sự. Tôi không hiểu tại sao điều này lại khó thực hiện trong Android. Nhưng dù sao, 1 cho một câu trả lời tốt. Tôi nghĩ rằng tôi sẽ kết thúc gắn bó với GestureDetector cho bây giờ, và thực hiện một số cử chỉ multifinger của riêng tôi để thêm chức năng bổ sung cử chỉ khôn ngoan. – capcom

+0

Cũng lưu ý rằng khi tôi cung cấp tiền thưởng, tôi đã đề cập cụ thể rằng câu trả lời không được bao gồm GestureDetector. Nhưng dù sao cũng cảm ơn rất nhiều. – capcom

+0

@capcom Bất cứ lúc nào, nhưng hãy cho tôi biết nếu bạn có thể nhận gestureOverlayView hoạt động. Tôi đã cố gắng rất nhiều, phải tạo ra những cử chỉ phức tạp hơn, thao tác vuốt đơn giản dường như không hoạt động. –

0

Có lẽ không phải là cách tốt nhất để đi về nó, nhưng bạn có thể ghi đè lên hành vi mặc định bằng cách mở rộng GestureOverlayView

Bạn sẽ cần phải ghi đè lên các phương pháp private Rect touchMove(MotionEvent event) và thoát khỏi việc kiểm tra định hướng:

if (box.squareness > mGestureStrokeSquarenessTreshold || 
    (mOrientation == ORIENTATION_VERTICAL ? 
     angle < mGestureStrokeAngleThreshold : 
     angle > mGestureStrokeAngleThreshold)) { 

    mIsGesturing = true; 
    ... 
    ... 
} 

Đây là nơi duy nhất có hướng được sử dụng, vì vậy không cần phải sửa đổi rộng rãi. Chỉ cần mở rộng/ghi đè đơn giản.

Tất nhiên, để làm điều đó đúng, bạn muốn thêm một ORIENTATION_NONE và kiểm tra chống lại rằng, giống như họ đã làm cho Replicant Project, nhưng tôi đoán rằng phụ thuộc vào nếu bạn sẽ bao giờ cần các chức năng một lần nữa.

+0

Có vẻ thú vị, chắc chắn sẽ cố gắng và cho bạn biết. – capcom

0

Bạn đã xem http://developer.android.com/training/gestures/index.html chưa? Tôi cần thêm một chút thông tin về những gì bạn đang cố gắng thực hiện với cử chỉ ngang và dọc để đưa ra lời khuyên cụ thể hơn. Nhưng có một khu vực cảm ứng mà làm một điều với swipes ngang và một điều với swipes dọc chắc chắn là có thể. Điều quan trọng không phải là bạn đang tìm kiếm các đường thẳng hoàn hảo, vì người dùng của bạn sẽ không thể tạo chúng.

Chỉnh sửa (1): Bạn đã xem http://www.vogella.com/articles/AndroidGestures/article.html chưa? Vogella dường như ngụ ý với ví dụ của anh ấy rằng bạn có thể có cử chỉ lên và cử chỉ ngang trong GestureOverlayView. Đây có phải là những gì bạn đang cố gắng làm không?

+0

Tôi đã thấy liên kết đó. Những gì tôi đang cố gắng làm là khá đơn giản: Tôi muốn sử dụng các cử chỉ tùy chỉnh từ lớp GestureOverlayView, cùng với cử chỉ dọc và ngang. Tuy nhiên, lớp đó không cho phép các cử chỉ ngang/dọc 'thuần túy' vì nó diễn giải những hành động đó khi cuộn (afaik). Tôi không có bất kỳ thùng chứa có thể cuộn nào trong tầm nhìn của tôi. Bởi hoàn toàn theo chiều dọc/ngang, tôi không thực sự có nghĩa là các đường thẳng phải hoàn toàn thẳng. Chỉ là khoảng. Tôi không yêu cầu người dùng làm bất cứ điều gì không tự nhiên. Cảm ơn. – capcom

+0

Câu hỏi của tôi, là việc sử dụng 2 cử chỉ. Có một 'GestureDetector' có thể nhận ra cử chỉ cuộn, mà các đường kẻ ngang và dọc là (ngay cả khi bạn không cuộn nội dung của vùng chứa). Có đánh chặn liên lạc có nghĩa là một chế độ xem có sẵn có thể giữ cho các sự kiện chuyển động cho chính nó trong một số tình huống và chuyển chúng sang chế độ xem con trong các tình huống khác. –

+0

Sự phức tạp của những gì bạn muốn làm là liên quan đến thực tế là bạn không thể mong đợi đường thẳng từ người dùng. Tôi đã không buộc tội bạn muốn. Tuy nhiên, nó có nghĩa là "phát hiện" cử chỉ cần phải được hạn chế để nó có thể chắc chắn của một cử chỉ trong khi cho phép một người dùng để thực hiện đột quỵ thô. –

5

Tất cả bạn phải làm, được thiết lập GestureStrokeAngleThreshold đến một giá trị xấp xỉ 90 (tôi đã sử dụng 90f)

Giá trị mặc định của threashold góc được 40.0f vì trong đó cử chỉ dọc đơn giản của bạn sẽ bị bỏ qua

+0

Làm việc cho tôi. ") Cảm ơn –

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