2010-10-22 35 views
6

Tôi có chế độ xem Android mà tôi đang phát hiện cử chỉ đang thực hiện thao tác và tôi muốn viết một số kiểm tra để xác minh rằng cử chỉ hoạt động chính xác. Tôi đã thử TouchUtils.dragViewToTouchUtils.drag (với một số lượng rất nhỏ các bước) nhưng không có trong số này dường như kích hoạt sự kiện.Mô phỏng cử chỉ thoát trong Android ActivityInstrumentationTestCase2

Có cách nào để mô phỏng cử chỉ không?

+1

Are không thì bạn thử nghiệm những điều sai trái? Những gì bạn _would_ muốn thử nghiệm, là hành động được thực hiện khi các cử chỉ fling xảy ra. Tôi cho rằng cử chỉ fling chỉ là một sự kiện đơn giản với một trình nghe sự kiện được đính kèm. Bên trong trình nghe sự kiện, bạn có thể gọi một số hàm - và đó là hàm _that_ mà bạn muốn kiểm tra. – Nailuj

+0

Tôi đã thử nghiệm chức năng đầu ra nhưng tôi muốn biết rằng nó thực hiện đúng với cử chỉ fling vì nó quan trọng hướng mà cử chỉ xảy ra và tôi muốn kiểm tra logic của nó khi người nghe diễn giải hướng của fling. Nó chỉ có vẻ lạ mà tôi có thể tương tác với quan điểm bằng cách mô phỏng chạm và kéo nhưng không có thao tác kéo nào có vẻ như thực hiện một fling. Tôi chỉ tự hỏi nếu tôi thiếu một cái gì đó tinh tế – Kevin

+1

Ok, tôi hiểu. Bây giờ đây chỉ là tôi nghĩ lớn (và tôi không quá quen thuộc với thử nghiệm trong Android, vì vậy có thể có vấn đề tôi không thấy với cách tiếp cận này), nhưng nếu bạn muốn kiểm tra logic giải thích cử chỉ, không thể ' t bạn chỉ cần đặt trong một lớp trừu tượng? Trong trình xử lý sự kiện 'onFling' của bạn, bạn chỉ cần chuyển tất cả các đối số cùng với hàm' processFlingEvent (MotionEvent, MotionEvent, float, float) 'của riêng bạn, mà sau đó sẽ dễ kiểm tra hơn? – Nailuj

Trả lời

0

Từ nhìn vào nguồn TouchUtils, vấn đề ở đây là số bước chỉ là số sự kiện cảm ứng để tạo ra và không ảnh hưởng đến nhanh như thế nào khi chúng xảy ra:

for (int i = 0; i < stepCount; ++i) { 
     y += yStep; 
     x += xStep; 
     eventTime = SystemClock.uptimeMillis(); 
     event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 0); 
     inst.sendPointerSync(event); 
     inst.waitForIdleSync(); 
    } 

Nó chờ đợi một đồng bộ với các ứng dụng sau mỗi sự kiện, do đó, nó không có vẻ như đó là xảy ra đủ nhanh để ném. Chúng ta có thể thấy rằng từ cách GestureDetector nhận một fling:

  // A fling must travel the minimum tap distance 
      final VelocityTracker velocityTracker = mVelocityTracker; 
      velocityTracker.computeCurrentVelocity(1000); 
      final float velocityY = velocityTracker.getYVelocity(); 
      final float velocityX = velocityTracker.getXVelocity(); 

      if ((Math.abs(velocityY) > ViewConfiguration.getMinimumFlingVelocity()) 
        || (Math.abs(velocityX) > ViewConfiguration.getMinimumFlingVelocity())){ 
       handled = mListener.onFling(mCurrentDownEvent, mCurrentUpEvent, velocityX, velocityY); 
      } 

Vì vậy, tôi đề nghị một phương pháp tùy chỉnh kéo mà không chờ đồng bộ trên mỗi sự kiện di chuyển cảm ứng (chúng tôi không quan tâm rằng các bản cập nhật giao diện người dùng với nhau kéo di chuyển anyway, chúng tôi chỉ muốn tạo ra một fling). Một cái gì đó như thế này (không kiểm tra):

public static void fling(InstrumentationTestCase test, float fromX, float toX, float fromY, 
     float toY, int stepCount) { 
    Instrumentation inst = test.getInstrumentation(); 

    long downTime = SystemClock.uptimeMillis(); 
    long eventTime = SystemClock.uptimeMillis(); 

    float y = fromY; 
    float x = fromX; 

    float yStep = (toY - fromY)/stepCount; 
    float xStep = (toX - fromX)/stepCount; 

    MotionEvent event = MotionEvent.obtain(downTime, eventTime, 
      MotionEvent.ACTION_DOWN, fromX, y, 0); 
    inst.sendPointerSync(event); 
    inst.waitForIdleSync(); 

    for (int i = 0; i < stepCount; ++i) { 
     y += yStep; 
     x += xStep; 
     eventTime = SystemClock.uptimeMillis(); 
     event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, x, y, 0); 
     inst.sendPointerSync(event); 
     //inst.waitForIdleSync(); 
    } 

    eventTime = SystemClock.uptimeMillis(); 
    event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, fromX, y, 0); 
    inst.sendPointerSync(event); 
    inst.waitForIdleSync(); 
} 

Vâng, thực sự tất cả những gì đã làm là có ghi chú bên ngoài chờ đợi đồng bộ nhàn rỗi trong vòng lặp sự kiện chuyển động. Chọn một số giá trị hợp lý cho khoảng cách đi và số bước và điều đó sẽ hoạt động. Nếu không, bạn có thể cần chờ đợi ngắn trong vòng lặp để giảm bớt không gian cho các sự kiện nếu chúng đến quá nhanh.

0

không chắc chắn nếu đây là những gì bạn đang tìm kiếm, nhưng đây là một ví dụ về một bài kiểm tra tôi đã viết để đảm bảo rằng cử chỉ fling đang làm việc trên một thành phần thư viện tùy chỉnh.

public void testLeftSwipe() { 
    int initialSelectedItemPosition = mGallery.getSelectedItemPosition(); 

    Rect r = new Rect(); 
    mGallery.getGlobalVisibleRect(r); 

    float fromX = r.centerX(); 
    float toX = r.centerX() - (r.width()/4); 
    float fromY = r.centerY(); 
    float toY = r.centerY(); 
    int stepCount = 10; 

    TouchUtils.drag(this, fromX, toX, fromY, toY, stepCount); 

    assertTrue(mGallery.getSelectedItemPosition() > initialSelectedItemPosition); 
} 
2

Ok, đây là một câu hỏi thực sự cũ, nhưng việc đăng một giải pháp mà làm việc cho tôi, có thể giúp những người đi tìm kiếm này

int[] xy = new int[2]; 
View v = currentActivity.getCurrentFocus(); 
v.getLocationOnScreen(xy); 
final int viewWidth = v.getWidth(); 
final int viewHeight = v.getHeight(); 
final float x = xy[0] + (viewWidth/2.0f); 
float fromY = xy[1] + (viewHeight/2.0f); 
int screenWidth = currentActivity.getWindowManager().getDefaultDisplay().getWidth();  
//Drag from centre of screen to Leftmost edge of display 
TouchUtils.drag(this, (screenWidth - 1), x, fromY, fromY , 5); //Vary the last parameter to sdjust speed of fling 
Các vấn đề liên quan