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.
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
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
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