studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android ontouchlistener

para - manual de programacion android pdf



OnTouchEvent no funciona en vistas de niños (6)

El problema es el orden de las operaciones de cómo Android maneja los eventos táctiles. Cada evento táctil sigue el patrón de (ejemplo simplificado):

  1. Activity.dispatchTouchEvent ()
  2. ViewGroup.dispatchTouchEvent ()
  3. View.dispatchTouchEvent ()
  4. View.onTouchEvent ()
  5. ViewGroup.onTouchEvent ()
  6. Activity.onTouchEvent ()

Pero los eventos solo siguen la cadena hasta que se consumen (lo que significa que alguien devuelve true desde onTouchEvent() o un oyente). En el caso de que solo toques en algún lugar de la pantalla, a nadie le interesa el evento, por lo que fluye hasta tu código. Sin embargo, en el caso de un botón (u otra View puede hacer clic), consume el evento táctil porque está interesado en él, por lo que el flujo se detiene en la Línea 4.

Si desea monitorear todos los toques que entran en su Actividad, necesita anular dispatchTouchEvent() ya que para eso siempre se llama primero, onTouchEvent() para una Actividad se llama último, y solo si nadie más capturó el evento. Sin embargo, tenga cuidado de no consumir eventos aquí, o las vistas secundarias nunca los obtendrán y no se podrá hacer clic en sus botones.

public boolean dispatchTouchEvent(MotionEvent event) { int eventaction=event.getAction(); switch(eventaction) { case MotionEvent.ACTION_MOVE: reg.setText("hey"); break; default: break; } return super.dispatchTouchEvent(event); }

Otra opción sería colocar su código de manejo táctil en un ViewGroup personalizado (como LinearLayout ) y usar su método onInterceptTouchEvent() para permitir que la vista principal se onInterceptTouchEvent() y maneje eventos táctiles cuando sea necesario. Sin embargo, ten cuidado, ya que esta interacción no se puede deshacer hasta que comience un nuevo evento táctil (una vez que robas un evento, los robas todos).

HTH

Tengo un diseño lineal que tiene un botón y un TextView en él. He escrito un OnTouchEvent para la actividad. El código funciona bien si toco la pantalla, pero si toco el botón, el código no funciona. ¿Cuál es la posible solución para esto?

public boolean onTouchEvent(MotionEvent event) { int eventaction=event.getAction(); switch(eventaction) { case MotionEvent.ACTION_MOVE: reg.setText("hey"); break; } return true; }



Permítanme agregar un comentario más a esta excelente publicación de @Devunwired.

Si también ha configurado un onTouchListener en su Vista, entonces su método onTouch () se llamará DESPUÉS de los métodos de envío, pero ANTES de cualquier método onTouchEvent (), es decir, entre el no.3 y el no.4 en la respuesta de @ Devunwired.


También puedes probar en onUserInteraction() :

@Override public void onUserInteraction(){ //your code here super.onUserInteraction(); }

funciona bien para mi


use public boolean dispatchTouchEvent(MotionEvent event) lugar de onTouchEvent()


Activity::onTouchEvent se llamará solo cuando Activity::onTouchEvent de las vistas en la ventana de la actividad consuma / maneje el evento. Si toca el Button , el Button consumirá los eventos, por lo que la actividad no podrá manejarlo.

Echa un vistazo a los siguientes artículos para obtener más información sobre el sistema de manejo de eventos Android Touch.

http://pierrchen.blogspot.jp/2014/03/pipeline-of-android-touch-event-handling.html