Android: ViewGroup, cómo interceptar MotionEvent y luego enviar a destino o comer a demanda?

Dado que hay un ViewGroup con varios hijos. En cuanto a este ViewGroup, me gustaría tener la gestión de todos los MotionEvent para todos sus hijos, lo que dice VG
1. Ser capaz de interceptar todos los eventos antes de que sean enviados a la meta (niños)
2. VG primero consumirá el evento, y determinará si enviará más lejos el acontecimiento al niño de la blanco
3. ABAJO, MOVE, ARRIBA, me gustaría verlos como relativamente independientes, lo que significa que VG podría comer hacia abajo, pero dar MOVE y UP a los niños.

He leído la guía SDK "Manejo del evento UI", conocí a los oyentes de eventos, los manejadores, ViewGroup.onInterceptTouchEvent (MotionEvent) y View.onTouchEvent (MotionEvent).

Aquí está mi muestra,

@Override public boolean onInterceptTouchEvent (MotionEvent event) { if (MotionEvent.ACTION_DOWN == event.getAction()) { return true; } return super.onInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { if (MotionEvent.ACTION_DOWN == event.getAction()) { return true; } else { if (!consumeEvent(event)) { // TODO: dispatch to target since I didn't want to eat event //return this.dispatchTouchEvent(event); // infinite loop!!! } } return super.onTouchEvent(event); } 

Para ser capaz de comer algunos eventos, tengo que devolver verdad en por encima de ambos métodos cuando se produjo un evento DOWN, porque SDK lo dijo. Entonces pude ver MOVE y subir en onTouchEvent. Sin embargo, en mi caso, no tengo ni idea de cómo enviar el evento a los niños.

Por encima de dispatchTouchEvent llevó a bucle infinito, lo que era comprensible, ya que VG en sí podría ser el objetivo. No puedo decir cuál sería el objetivo en ese momento, MotionEvent no dio una pista, así que dispatchTouchEvent fue totalmente inútil.
¿Alguien me ayuda? Gracias.

No hay una manera fácil de encontrar la fuente View from onInterceptTouchEvent , ni hay una forma de "despachar" estos eventos. Puede enviar KeyEvent s, pero no MotionEvent s.

Una manera común de tratar con MotionEvent s (por ejemplo, para arrastrar y soltar) es manejar los eventos de MotionEvent.ACTION_DOWN por las diferentes View s (a través de la onTouch llamada onTouch después de implementar OnTouchListener ) y los eventos de MotionEvent.ACTION_MOVE través del Viewgroup ' S método onInterceptTouchEvent .


Pero algunos LOC dicen mucho más que un puñado de palabras. Hay un ejemplo muy bonito de lo que estoy diciendo aquí: http://doandroids.com/blogs/tag/codeexample/


Si maneja el evento ACTION_DOWN en la vista en sí, puede almacenar qué vista se inició en otro lugar y utilizar esa variable para otras acciones. El Evento está enlazado a la misma Vista hasta que se haya completado una acción ACTION_UP o ACTION_CANCEL.

Si necesita realizar un seguimiento de la vista y ejecutar una acción en el grupo de vistas durante el ACTION_DOWN, le sugiero que agregue un método público en su ViewGroup (por ejemplo, public boolean handleActionDown (View v, MotionEvent e) que se llamará desde onTouch llamar de vuelta

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.