Cuando se envía el evento de entrada, se llamará
int32_t InputDispatcher ::findTouchedWindowTargetsLocked
La escritura en este lugar es más complicada, luego de hacer clic, deslizar el dedo, puede revisar el registro y encontrar que este método será llamado continuamente.
Se eliminan algunos eventos de clic, que también se manejan aquí,
Cuando se hace clic, newGesture es verdadero
1204 bool newGesture = ( maskedAction == AMOTION_EVENT_ACTION_DOWN 1205 || maskedAction == AMOTION_EVENT_ACTION_SCROLL 1206 || isHoverAction );
Cuando se desliza y sube el dedo, newGesture es falso y newGesture afecta la lógica de procesamiento posterior
1237 if ( newGesture || ( isSplit && maskedAction == AMOTION_EVENT_ACTION_POINTER_DOWN )) { 1238 / * Caso 1: Nuevo puntero divisible bajando, o necesita un objetivo para desplazarse o desplazarse. * /
1323 } else { 1324 / * Caso 2: El puntero se mueve, sube, cancela o no se puede dividir hacia abajo. * / 1325 1326 // Si el puntero no está actualmente abajo, ignore el evento. 1327 if (! MTempTouchState . Down ) { 1328 # if DEBUG_FOCUS 1329 ALOGD (" Eliminando el evento porque el puntero no está hacia abajo o porque previamente" 1330 " eliminamos el evento de puntero hacia abajo."); 1331 # endif 1332 injectionResult = INPUT_EVENT_INJECTION_FAILED ; 1333 goto Falló ; 1334 }
Aquí mTempTouchState . Down afecta el flujo de procesamiento.
La lógica del código de mTempTouchState es confusa,
Puede agregar una vista de registro
mTempTouchState . Abajo proceso de cambio de valor.
En el multi-clic, los eventos de entrada cuando se inyectan, mTempTouchState . ¿ El valor hacia abajo es cómo cambiarlo?
1513 // Actualiza las piezas finales del estado táctil si el inyector tenía permiso. 1514 si ( injectionPermission == INJECTION_PERMISSION_GRANTED ) { 1515 si (! WrongDevice ) { 1516 si ( switchedDevice ) { 1517 # Si DEBUG_FOCUS 1518 ALOGD ( "acciones de puntero en conflicto:. Al cambiar a un dispositivo diferente"); 1519 # endif 1520 * outConflictingPointerActions = true ; 1521 } 1522 1523 if ( isHoverAction ) {
1538 } else if ( maskedAction == AMOTION_EVENT_ACTION_UP 1539 || maskedAction == AMOTION_EVENT_ACTION_CANCEL ) { 1540 // Todos los indicadores hacia arriba o cancelados. 1541 mTempTouchState . restablecer ();
Aquí puedes concentrarte en
El método de reinicio se establecerá en falso
4519 void InputDispatcher :: TouchState ::reset () { 4520 abajo = falso ; 4521 split = falso ; 4522 deviceId = -1; 4523 fuente = 0; 4524 displayId = -1; 4525 ventanas . claro (); 4526 }