Cómo enviar evento de puntero en Android

Estoy tratando de detectar la altura del teclado virtual en Android.

Encontré un tema similar: Obtener la altura del teclado virtual en Android

Parece que el autor encontró una manera de detectar la altura:

Encontré una manera de conseguirlo. Después de que pido para abrir el teclado virtual, envío evento de puntero que genero. Su coordenada y comienza desde la altura del dispositivo y disminuye.

No entiendo cómo hacerlo.

Usaré el código proporcionado en el enlace que publicó:

// Declare Variables int softkeyboard_height = 0; boolean calculated_keyboard_height; Instrumentation instrumentation; // Initialize instrumentation sometime before starting the thread instrumentation = new Instrumentation(); 

mainScreenView es su vista base, la vista de su actividad. m (ACTION_DOWN) y m1 (ACTION_UP) son eventos táctiles que se envían utilizando Instrumentation#sendPointerSync(MotionEvent) . La lógica es que un MotionEvent despachado a donde el teclado está siendo mostrado causará la siguiente SecurityException :

Java.lang.SecurityException: Inyectar a otra aplicación requiere el permiso de INJECT_EVENTS

Por lo tanto, comenzamos en la parte inferior de la pantalla y hacemos nuestro camino hacia arriba (al decrementar y ) en cada iteración del bucle. Para cierto número de iteraciones, obtendremos una SecurityException (que atraparemos): esto implicaría que el MotionEvent está pasando por el teclado. El momento y hace lo suficientemente pequeño (cuando está justo encima del teclado), saldremos del lazo y calcularemos la altura del teclado usando:

 softkeyboard_height = mainScreenView.getHeight() - y; 

Código:

 Thread t = new Thread(){ public void run() { int y = mainScreenView.getHeight()-2; int x = 10; int counter = 0; int height = y; while (true){ final MotionEvent m = MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 1); final MotionEvent m1 = MotionEvent.obtain( SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 1); boolean pointer_on_softkeyboard = false; try { instrumentation.sendPointerSync(m); instrumentation.sendPointerSync(m1); } catch (SecurityException e) { pointer_on_softkeyboard = true; } if (!pointer_on_softkeyboard){ if (y == height){ if (counter++ < 100){ Thread.yield(); continue; } } else if (y > 0){ softkeyboard_height = mainScreenView.getHeight() - y; Log.i("", "Soft Keyboard's height is: " + softkeyboard_height); } break; } y--; } if (softkeyboard_height > 0 ){ // it is calculated and saved in softkeyboard_height } else { calculated_keyboard_height = false; } } }; t.start(); 

Instrumentation#sendPointerSync(MotionEvent) :

Enviar un evento de puntero. Finalizado en algún momento después de que el destinatario ha regresado de su procesamiento de eventos, aunque puede que no haya terminado completamente de reaccionar desde el evento. Por ejemplo, si necesita actualizar su visualización como resultado, puede estar en proceso de hacer ese.

Utilice OnGlobalLayoutListener, funciona perfectamente para mí.

  • Android MultiSelectListPreference uncheck no se dispara SharedPreferenceChanged
  • ¿Cómo enviar MotionEvent sintetizado a través del sistema?
  • Buscando un evento más universal onUserInteraction () - no solo en una actividad
  • Google Analytics: lista los valores de eventos por etiqueta de evento
  • ¿Quieres saber más sobre la cola de eventos de subprocesos de la interfaz de usuario de Android
  • ¿Cómo agregar un evento en Google Calendar desde la actividad?
  • Disposición de superposición de Android encima de todas las ventanas que recibe toques
  • Android: Cómo invocar programaticamente evento onScroll en ListView
  • Captura de eventos táctiles en un elemento de lista de Android e impide el desplazamiento
  • Implementar un escucha para una clase en lugar de una instancia
  • Motionevent.getX y getY
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.