¿Qué significa el valor booleano devuelto por un método de manejo de eventos en Android

En Android, la mayoría de los métodos de escucha de eventos devuelven un valor booleano. ¿Qué significa ese valor verdadero / falso? ¿Qué resultará en los eventos posteriores?

class MyTouchListener implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { logView.showEvent(event); return true; } } 

En cuanto al ejemplo anterior, si devuelve true en el método onTouch , encuentro que cada evento táctil (DOWN, UP, MOVE, etc.) ha sido capturado según mi logView . Por el contrario, si el resultado es falso, solo se ha capturado el evento DOWN. Por lo tanto, parece que el retorno falso evitará que el evento se propague. Estoy en lo correcto ?

Además, en un OnGestureListener , muchos métodos tienen que devolver un valor booleano también. ¿Tienen el mismo significado?

Si devuelve la true de un evento ACTION_DOWN , está interesado en el rest de los eventos en ese gesto. Un “gesto” en este caso significa todos los eventos hasta el ACTION_UP o ACTION_CANCEL final. Si ACTION_DOWN false desde un ACTION_DOWN significa que no desea que el evento y otras vistas tengan la oportunidad de manejarlo. Si tiene vistas superpuestas, esta puede ser una vista de hermanos. Si no, se disparará hasta el padre.

De la documentación: http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.View , android.view.MotionEvent)

“Es cierto si el oyente ha consumido el evento, de lo contrario es falso”.

Si devuelve verdadero, el evento se procesa. Si es falso, irá a la siguiente capa hacia abajo.

El valor booleano determina si el evento se consume o no.

Sí, estás en lo cierto. Si devuelve falso, el siguiente oyente maneja el evento. Si devuelve verdadero, su oyente consume el evento y no lo envía al siguiente método.

Perdí casi un día en la resolución de problemas, pero me enteré de que mi función onTouch se llama 2 veces cuando se usa verdadero y 1 vez cuando se usa falso.

De Android-documento :

Nota: Android llamará a los manejadores de eventos primero y luego a los manejadores predeterminados apropiados de la definición de clase en segundo lugar. Como tal, la devolución verdadera de estos detectores de eventos detendrá la propagación del evento a otros detectores de eventos y también bloqueará la callback al controlador de eventos predeterminado en la Vista. Así que asegúrese de querer finalizar el evento cuando vuelva verdadero.

Todas las respuestas anteriores son correctas, pero el resultado es diferente si se clickable la vista o no clickable

Por ejemplo , tengo un LinearLayout contiene 1 Button y 1 TextView como este

     

En Activity, tengo código como

 class MainActivity : AppCompatActivity() { val TAG = "TAG" @SuppressLint("ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById(R.id.linearlayout_root).setOnTouchListener { v, event -> Log.i(TAG, "LinearLayout onTouch event " + getDisplayAction(event.action)) false } findViewById 

Caso 1 Linear onTouch return **FALSE** , Button onTouch return **FALSE** , TextView onTouch return **FALSE**

Haga clic en el botón

 I/TAG: Button onTouch eventDOWN I/TAG: Button onTouch eventMOVE I/TAG: Button onTouch eventUP 

Haga clic en TextView

 TAG: TextView onTouch eventDOWN TAG: LinearLayout onTouch eventDOWN 

Haga clic en LinearLayout

 TAG: LinearLayout onTouch eventDOWN 

Caso 2 Linear onTouch return **FALSE** , Button onTouch return **TRUE** , TextView onTouch return **TRUE**

Haga clic en el botón

 Similar to case 1 

Haga clic en TextView

 TAG: TextView onTouch event DOWN TAG: TextView onTouch event MOVE TAG: TextView onTouch event UP 

Haga clic en LinearLayout

 Similar to case 1 

Caso 3 Linear onTouch return **TRUE** , Button onTouch return **FALSE** , TextView onTouch return **FALSE**

Haga clic en el botón

 Similar to case 1 

Haga clic en TextView

 TAG: TextView onTouch event DOWN TAG: LinearLayout onTouch event DOWN TAG: LinearLayout onTouch event MOVE TAG: LinearLayout onTouch event UP 

Haga clic en LinearLayout

 TAG: LinearLayout onTouch event DOWN TAG: LinearLayout onTouch event MOVE TAG: LinearLayout onTouch event UP 

Nota

  • El valor predeterminado de TextView not clickable , se puede hacer clic si configuramos android:clickable="true" en xml O cuando establecemos textView.setOnClickListener(...)
  • Cuando depura, event MOVE puede llamar más que mi registro (se basa en cómo se toca)

Resumen

  • onTouch return true o view se clickable , View recibirá todo onTouchEvent
  • onTouch devuelve false y no se clickable vista, view no recibirá NEXT onTouchEvent (su padre puede recibirlo)

Espero que ayude
MANIFESTACIÓN