¿Cómo hago un MotionEvent para hacer zoom?
Tengo una instrumentación que quiero usar para probar mi aplicación, pero no puedo conseguir el pinch zoom para simular correctamente. Aquí está mi código actual. La esencia de esto es esto: empuje hacia abajo tanto el dedo 1 y el dedo 2, mueva los dos más cerca uno del otro, luego suelte ambos.
private void performZoomTest(int numUpdates) { long downTime = SystemClock.uptimeMillis(); long eventTime = SystemClock.uptimeMillis(); float x1 = 0; float y1 = 0; Display main = activity.getWindowManager().getDefaultDisplay(); float x2 = main.getWidth(); float y2 = main.getHeight(); float xstep = x2 / (2 * numUpdates); float ystep = y2 / (2 * numUpdates); int id1 = 0 << MotionEvent.ACTION_POINTER_ID_SHIFT; int id2 = 1 << MotionEvent.ACTION_POINTER_ID_SHIFT; MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN + id1, x1, y1, 0); sendPointerSync(event); event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN + id2, x2, y2, 0); sendPointerSync(event); waitForIdleSync(); for (int i = 0; i < numUpdates; i++) { eventTime = SystemClock.uptimeMillis(); Log.i("",Integer.toString(i)); x1 += xstep; y1 += ystep; x2 -= xstep; y2 -= ystep; event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE + id1, x1, y1, 0); Log.i("id1", Integer.toString(MotionEvent.ACTION_MOVE + id1)); sendPointerSync(event); event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE + id2, x2, y2, 0); Log.i("id1", Integer.toString(MotionEvent.ACTION_MOVE + id2)); sendPointerSync(event); waitForIdleSync(); } eventTime = SystemClock.uptimeMillis(); event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP + id1, x1, y1, 0); sendPointerSync(event); event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP + id2, x2, y2, 0); sendPointerSync(event); waitForIdleSync(); }
El resultado parece ser que la aplicación considera que los dos eventos son distintos y no los registra como un evento único. ¿Hay una mejor manera de hacer esto?
- ¿Qué hace la referencia `android.accounts.Account.type`?
- Pruebas de Android. Café exprés. Cambiar texto en un TextView
- Android: prueba la aplicación en un dispositivo real
- Android Espresso: Ejecución de múltiples pruebas secuencialmente
- Probar el estado del ciclo de vida y restaurar del proceso de aplicación de Android cuando se alcanza el estado de proceso vacío
- ¿Cómo puedo probar un clic en una determinada coordenada x, y?
- Cómo simular y probar la actualización de la aplicación en Android y iphone
- Cómo ejecutar proyecto de prueba de unidad de android
- Cómo probar con Espresso un PendingIntent generado por TaskStackBuilder
- Android-volley cómo a prueba de unidad pasó en Listener
- ¿Cómo aceptar el diálogo en las pruebas unitarias?
- Cómo diseñar una aplicación de Android usando daga con la prueba en mente
- La manera más rápida de crear una actividad simulada para probar
Eche un vistazo aquí: https://stackoverflow.com/questions/522312/best-practices-for-unit-testing-android-apps
Creo que la prueba de unidad multitáctil no es posible con el marco estándar de Android.
No estoy seguro de exactamente lo que está haciendo mal, pero creo que hay algunos artículos por ahí que pueden ser de ayuda para usted.
Esta entrada en el blog de Google trata de manejar multi-touch, e incluso muestra cómo puedes hacer un gesto de dos dedos (es decir, zoom) que se distingue de un movimiento de diapositiva / desplazamiento / arrastre de un dedo.
Aquí hay un enlace al código del ejemplo.
Creo que el android API MotionEvent (ACTION_POINTER_DOWN, ACTION_MOVE, ACTION_POINTER_UP) resolvería el problema multi-touch. Sin embargo, no sé cómo obtener el parámetro "numUpdates".
Es perfectamente posible, como muestra este post en stackoverflow . Resuelve el problema de mi configuración.
- Archivos no eliminados al borrar y aún mostrados en Listview
- ¿Cuándo se usa realmente savedInstanceState?