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
- Implementación de eventos similares a C # en Android / Java
- ¿Detecta que el dispositivo está vibrando?
- ¿Cuánto dura el evento onLongPress en Android?
- android cómo escribir onclick evento de edittext
- Crear evento de Facebook en una aplicación para 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.
- ¿Cómo puedo realizar el procesamiento de eventos sin bloqueo en Android?
- Evento táctil: cuando se quita el dedo del elemento
- ¿Hay un evento directo para bloqueo de bloqueo de teclado?
- Obtener instancia de la actividad actualmente en ejecución?
- Los eventos de Android Flurry no se informan en el panel
- Detectar una captura de pantalla Android
- ¿Cómo capturar el evento "virtual keyboard show / hide" en Android?
- Cordova 3.4 - Detectar evento de teclado
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: ¿Es mejor iniciar y detener un servicio cada vez que sea necesario o dejar que un servicio funcione y se vincule y se desvincule de él?
- Android: copiar programaticamente apk en / system / app