В моем приложении есть функция, позволяющая пользователю изменять порядок элементов в списке путем длительного щелчка мыши, чтобы создать тень, которую затем пользователь может перетащить и вставить в выбранную позицию. После удаления элементы переупорядочиваются.
Я пытаюсь разработать для этого тест пользовательского интерфейса. Я могу либо успешно нажать на элемент, чтобы создать тень, ИЛИ реализовать перетаскивание. Кажется, я не могу объединить эти два действия в одно движение.
Я использую 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
Тестирование пользовательского интерфейса Android. Длительное нажатие и перетаскивание. ⇐ JAVA
Программисты JAVA общаются здесь
1734963418
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'.
Подробнее здесь: [url]https://stackoverflow.com/questions/48044959/android-ui-test-long-click-and-drag[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия