2011-02-15 14 views
54

Después de muchos experimentos con onTouchEvent y onTouch, encontré que onTouch funciona en cualquier lugar que desee (ya sea en actividad o vista) ¡siempre y cuando haya declarado la interfaz y haya configurado el Listener! ¡Por otro lado, onTouchEvent solo funciona dentro de una Vista! ¿Mi suposición es correcta? ¿Es esta la verdadera diferencia?onTouchevent() vs onTouch()

+0

@trojanfoe & stelios: Gracias chicos por la pregunta y la respuesta. Pero estoy un poco confundido. La razón es: "Tengo una actividad que implementa OnClickListener y el controlador de eventos onClick (View v). No he implementado en TouchListener. Pero tengo onTouchEvent (MotionEvent e) para manejar el evento swipe. El código funciona bien sin problemas. " Así que mi duda es cómo funciona onTouchEvent() aquí (en la actividad) ya que solo funciona en la vista. Además, no he implementado OnTouchLister o llamado a setOnTouchListener(), ¿qué hace que funcione? – Dexter

+0

al devolver 'true' en onTouch() no se activará enTouchEvent. – Johnny

Respuesta

37

Sí que son correctas - onTouch() es utilizado por los usuarios del View obtener los eventos táctiles mientras onTouchEvent() es utilizado por las clases derivadas del View obtener los eventos táctiles.

+2

no está claro qué significan las clases derivadas aquí, si estoy en actividad solo trabajo en esta actividad – ERJAN

4

El onTouchEvent() en realidad se llamará a si ninguna de las vistas consume el evento táctil.

Y como usted dice, el onTouch() se puede utilizar en cualquier clase, siempre y cuando:

  1. Esa clase (es decir, Foo) implementa la interfaz OnTouchListener y
  2. Esa clase es un detector registrado utilizando view.setOnTouchListener(foo);
5

he utilizado ontouch() y ontouchevent(), como ontouch se utiliza cuando quiero trabajar en los elementos de visión única, al igual que los botones, imagebuttons etc en un solo punto de vista (por ejemplo LinearLayout), mientras que cuando i quiero trabajar en áreas resto de la m y elementos (por ejemplo, botón) uso ontouchevent.

25

Tuve cierta confusión relacionada con cómo funciona elTouchEvent() y onTouch() (Puede ver mi comentario a esta pregunta). Después de algunas investigaciones a continuación, es lo que he encontrado en él. Esto puede ser útil para principiantes.

1) Implementación:

Si desea utilizar onTouch() que tiene que hacer tres cosas.

1- aplicar OnTouchListener

2- setOnTouchListener call() de la vista que desea establecer capturar el evento

3- anulación onTouch() para controlar el evento

pero si quieres para usar en TouchEvent() no necesita hacer el paso 1 & 2 arriba. solo debe sobrescribir On TouchEvent().

2) Trabajo:

onTouch() obras expuestas, ViewGroup, la actividad. Lo que significa que puede usar onTouch() dentro de view, group o activity. Este método toma dos argumentos [onTouch (View v, MotionEvent e)]. Esto le permite filtrar eventos para diferentes vistas en una actividad o grupo de visualización. O la actividad puede en sí misma manejarlo. onTouchEvent() toma un argumento [onTouchEvent(MotionEvent e)]. Por lo tanto, esto se puede usar solo dentro de la vista que lo implementa o en la vista derivada. Una vista derivada habilita la extensión del comportamiento táctil definido en onTouchEvent().

Creo que estas opciones forman parte de la filosofía de desarrollo más flexible de Android, aunque a veces crea confusión para los alumnos.

4

Al crear una vista personalizada, puede

@override onTouchEvent(MotionEvent e){}

mientras que se puede añadir a cualquier onTouch Ver, ViewGroup o actividad.

onTouch(View v, MotionEvent e) { //you can filter any View's touch }

onTouch es genérico y onTouchEvent es específico para ver. Y también puede filtrar su vista usando onTouch.

0

Encontré otra diferencia. onTouchEvent no parece obtener los eventos obsoletos MotionEvent.ACTION_POINTER_2_DOWN y MotionEvent.ACTION_POINTER_2_UP.

Por supuesto, son bastante viejas y no deberíamos usarlas.

Esto es en Android 5.1 API 22.

0

onTouchEvent es un método implementado por el Ver, Actividad y otras clases de base como LinearLayout, etc ..

public boolean onTouchEvent(MotionEvent event) { 
    throw new RuntimeException("Stub!"); 
} 

puede anular este método por cualquiera de las clases derivadas

mientras que

onTouch() está definido por la interfaz OnTouchListener {}

public interface OnTouchListener { boolean onTouch(View var1, MotionEvent var2); }

lo que sólo necesita implementar uno al configurar esta interfaz para una clase

Cuestiones relacionadas