web-dev-qa-db-fra.com

onTouchevent () vs onTouch ()

Après de nombreuses expériences avec onTouchEvent et onTouch, j'ai constaté que onTouch fonctionnait où vous voulez (que ce soit en activité ou en affichage), à ​​condition que vous ayez déclaré l'interface et que vous ayez mis le récepteur à droite! D'autre part, onTouchEvent ne fonctionne que dans une vue! Mon hypothèse est-elle correcte? Est-ce la vraie différence? 

57
stelios

Oui, vous avez raison. onTouch() est utilisé par utilisateurs de View pour obtenir des événements tactiles, alors que onTouchEvent() est utilisé par classes dérivées de View pour obtenir des événements tactiles.

41
trojanfoe

J'ai eu une certaine confusion liée au fonctionnement de onTouchEvent () et onTouch () (vous pouvez voir mon commentaire sur cette question). Après quelques recherches, voici ce que j'ai trouvé dessus. Cela peut être utile aux débutants.

1) Mise en œuvre:

Si vous voulez utiliser onTouch (), vous devez faire trois choses.

1- implémenter OnTouchListener

2- appelez setOnTouchListener () sur la vue que vous voulez définir capturer l'événement

3- écrasez onTouch () pour gérer l'événement

mais si vous voulez utiliser onTouchEvent (), vous n'avez pas besoin de suivre les étapes 1 et 2 ci-dessus. vous devez juste remplacer onTouchEvent ().

2) de travail:

onTouch () fonctionne sur la vue, le groupe de vues, l'activité. Cela signifie que vous pouvez utiliser onTouch () dans une vue, un groupe de vues ou une activité. Cette méthode prend deux arguments [onTouch (View v, MotionEvent e)]. Cela vous permet de filtrer les événements pour différentes vues dans une activité ou un groupe de vues. Ou l'activité peut elle-même le gérer . onTouchEvent () prend un argument [onTouchEvent(MotionEvent e)]. Ainsi, cela ne peut être utilisé que dans la vue qui l'implémente ou dans la vue dérivée. Une vue dérivée active l'extension du comportement tactile défini dans onTouchEvent (). 

Je pense que de telles options font partie de la philosophie de développement plus flexible d'Android, même si cela crée parfois de la confusion pour les apprenants.

28
Dexter

J'ai utilisé ontouch () et ontouchevent (), comme ontouch est utilisé lorsque je souhaite travailler sur des éléments d'affichage simple, tels que des boutons, des boutons d'image, etc. mes éléments (par exemple le bouton) que j'utilise ontouchevent. 

5
Walking Code

Lors de la création d’une vue personnalisée, vous pouvez 

@override onTouchEvent(MotionEvent e){}

alors que vous pouvez ajouter onTouch à n’importe quelle vue, groupe de vues ou activité.

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

onTouch est générique et onTouchEvent est spécifique à View. Et vous pouvez également filtrer votre vue à l’aide de onTouch.

4
Xar E Ahmer

OnTouchEvent () réellement sera sera appelé par l'activité si aucune des vues ne consomme l'événement tactile. 

Et comme vous le dites, onTouch () peut être utilisé dans n’importe quelle classe, à condition que:

  1. Cette classe (c'est-à-dire Foo) implémente l'interface OnTouchListener et 
  2. Cette classe est un auditeur enregistré utilisant view.setOnTouchListener(foo);
4
paiego

J'ai trouvé une autre différence. OnTouchEvent ne semble pas obtenir les événements déconseillés MotionEvent.ACTION_POINTER_2_DOWN et MotionEvent.ACTION_POINTER_2_UP.

Bien sûr, ils sont assez vieux et nous ne devrions pas les utiliser.

C'est dans Android 5.1 api 22.

0
Dave Hubbard

onTouchEvent est une méthode implémentée par View , Activity et d’autres classes de base telles que LinearLayout , etc ..

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

vous pouvez remplacer cette méthode par n'importe quelle classe dérivée

tandis que

onTouch () est défini par l'interface OnTouchListener {}

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

il vous suffit donc d'en implémenter un lors du paramétrage de cette interface pour une classe

0
gor