При взгляде на источник TouchUtils проблема заключается в том, что количество шагов - это просто количество событий касания, которые нужно сгенерировать, и не влияет на их скорость:
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();
}
Ожидание синхронизациис приложением после каждого события, так что не похоже, что это происходит достаточно быстро, чтобы бросить.Это видно из того, как GestureDetector распознает сброс:
// 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);
}
Поэтому я рекомендую использовать специальный метод перетаскивания, который не ожидает синхронизацию при каждом событии перемещения касания (нам все равно, что пользовательский интерфейс обновляетсяв любом случае, с каждым движением перетаскивания мы просто хотим создать бросок).Примерно так (не проверено):
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();
}
Ну, на самом деле все, что я там делал, это закомментировал ожидание холостого хода в цикле событий движения.Выберите некоторые разумные значения для пройденного расстояния и количества шагов, и это должно сработать.Если этого не произойдет, вам может потребоваться короткое ожидание в цикле, чтобы немного разметить события, если они происходят слишком быстро.