Тестирование пользовательского интерфейса Android. Длительное нажатие и перетаскивание.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Тестирование пользовательского интерфейса Android. Длительное нажатие и перетаскивание.

Сообщение Anonymous »

В моем приложении есть функция, позволяющая пользователю изменять порядок элементов в списке путем длительного щелчка мыши, чтобы создать тень, которую затем пользователь может перетащить и вставить в выбранную позицию. После удаления элементы переупорядочиваются.

Я пытаюсь разработать для этого тест пользовательского интерфейса. Я могу либо успешно нажать на элемент, чтобы создать тень, ИЛИ реализовать перетаскивание. Кажется, я не могу объединить эти два действия в одно движение.

Я использую Espresso и Barista в своих тестах пользовательского интерфейса Android.

Для длинного клика я использовал API Barista:

longClickOn("ITEM");


Для перетаскивания я попытался создать собственное действие Espresso ViewAction:

return new ViewAction() {
@Override
public Matcher getConstraints() {
return isAssignableFrom(ViewGroup.class);
}

@Override
public String getDescription() {
return "Swiping child " + srcIndex + " to child " + destIndex;
}

@Override
public void perform(UiController uiController, View view) {
ViewGroup parent = (ViewGroup) view;

final View srcChild = parent.getChildAt(srcIndex);
final View destChild = parent.getChildAt(destIndex);

final CoordinatesProvider srcCoordinatesProvider = new CoordinatesProvider() {
@Override
public float[] calculateCoordinates(View view) {
int[] location = new int[2];
srcChild.getLocationInWindow(location);
float x = location[0] + (view.getMeasuredWidth() / 2);
float y = location[1] + (view.getMeasuredHeight() / 2);

return new float[] {x, y};
}
};

final CoordinatesProvider destCoordinatesProvider = new CoordinatesProvider() {
@Override
public float[] calculateCoordinates(View view) {
int[] location = new int[2];
destChild.getLocationInWindow(location);
float x = location[0] + (view.getMeasuredWidth() / 2);
float y = location[1] + (view.getMeasuredHeight() / 2);

return new float[] {x, y};
}
};

GeneralSwipeAction swipe = new GeneralSwipeAction(Swipe.FAST,
srcCoordinatesProvider, destCoordinatesProvider, Press.FINGER);
swipe.perform(uiController, parent);
}
};




РЕДАКТИРОВАТЬ:

Следуя ответу @Be_Negative , я настроил данный ответ и получил следующее:

private static ViewAction drag(final int srcIndex, final int destIndex) {
return new ViewAction() {
@Override
public Matcher getConstraints() {
return isAssignableFrom(ViewGroup.class);
}

@Override
public String getDescription() {
return "Swiping child " + srcIndex + " to child " + destIndex;
}

@Override
public void perform(UiController uiController, View view) {
ViewGroup parent = (ViewGroup) view;

uiController.loopMainThreadUntilIdle();
final View srcChild = parent.getChildAt(srcIndex);
final View destChild = parent.getChildAt(destIndex);

final CoordinatesProvider coordinatesProvider = getCoordinatesProdvider();

float[] precision = Press.PINPOINT.describePrecision();
MotionEvent downEvent = MotionEvents.sendDown(uiController, coordinatesProvider.calculateCoordinates(srcChild), precision).down;

try {
long longPressTimeout = (long) (ViewConfiguration.getLongPressTimeout() * 1.5);
uiController.loopMainThreadForAtLeast(longPressTimeout);

float[][] steps = interpolateDragging(
coordinatesProvider.calculateCoordinates(srcChild),
coordinatesProvider.calculateCoordinates(destChild)
);

uiController.loopMainThreadUntilIdle();

for(float[] step : steps) {
if( !MotionEvents.sendMovement(uiController, downEvent, step)) {
MotionEvents.sendCancel(uiController, downEvent);
}
}

if(!MotionEvents.sendUp(uiController, downEvent, coordinatesProvider.calculateCoordinates(destChild))) {
MotionEvents.sendCancel(uiController, downEvent);
}
} catch(Exception e) {
System.out.println(e);
} finally {
downEvent.recycle();
}
}
};
}


К сожалению, в MotionEvents.sendMovement выдается ошибка следующим образом:

Error performing 'inject motion event (corresponding down event: MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=540.0, y[0]=302.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=BUTTON_PRIMARY, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=34586525, downTime=34586525, deviceId=0, source=0x1002 })' on view 'unknown'.


Подробнее здесь: https://stackoverflow.com/questions/480 ... k-and-drag
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»