¿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?

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.

  • Llamar a un método de la actividad probada de una prueba usando espresso y ver sus resultados
  • Uso de una aplicación personalizada con InstrumentationTestCase
  • Error java.lang.RuntimeException: Stub! En Android con pruebas de Fitnesse
  • Gradle: Cómo ejecutar la prueba de instrumentación para la clase
  • Acelerar el tiempo del emulador de Android
  • Actividad de prueba onCreate Exception
  • MonkeyRunner: manera fácil de determinar las coordenadas para MonkeyDevice touch comando?
  • Mismatched input 'esperando RPAREN: Mientras ejecuta el script jython
  • Espresso - Juego SeekBar
  • Emulador para probar APK
  • Cómo seleccionar el primer elemento de un spinner en una prueba
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.